如何在Cocoa应用程序中切换视图?

Dav*_*cia 8 macos cocoa objective-c nsviewcontroller

所以我开始学习如何使用Cocoa.我想我已经得到了它,但我已经挂断了创建和切换视图.我正在改写我之前做过的练习游戏.我想要的只是一个窗口(最好不能调整大小),我希望能够在游戏中切换不同屏幕的视图.

首先,我有主菜单(开始游戏,高分,退出).然后我需要一个窗口为每个屏幕(游戏屏幕,高分屏幕).

我对此感到困惑的是如何设计它.我查找了NSViewController,认为它管理视图,但事实并非如此.它只通过加载它来管理一个视图.我不明白为什么我需要使用NSViewController.难道我不能只有一个包含多个NSView子类的窗口类并加载它们吗?我不确定我是否了解ViewController的用途.

我的Window类是否真的需要子类化NSWindowController?我试图按照Apple的ViewController示例的例子,它有一个窗口控制器类,它是NSWindowController的子类.我没有看到子类化的目的是什么.所有NSWindowController似乎都添加了- initWithPath:(NSString *)newPath但是当我可以编辑plist文件以在启动时打开窗口时,我无法看到它的用途.Apple的例子还有一个NSView变量和一个NSViewController变量.您是否只需要一个变量来存储当前视图?

先谢谢你们,我真的很困惑这是怎么回事.

Pau*_*aul 6

听起来你正试图在窗口中换掉内容视图?如果是这种情况,您可以使用-[NSView replaceSubview:with:]with -[NSWindow contentView]作为接收器.

假设您有一个名为的标题页titleView和一个名为的菜单页menuView,您希望将它们交换进应用程序的主窗口.如果标题页可见并且用户点击"主菜单"按钮或链接,您可以在按钮的委托方法中输入这样的内容:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView];
Run Code Online (Sandbox Code Playgroud)

有两点需要注意:

  1. titleView在这种情况下,旧视图由此调用释放.如果您希望它仍然可用,您必须retain在更换之前使用它.
  2. 如果您的网页具有不同的尺寸,则父视图不会调整大小.更改窗口的框架大小,因此contentView很容易,但您可以在混合中添加一些核心动画,以赋予它一些风格.

我希望这有帮助!


Chr*_*son 5

您可以使用NSWindowControllerNSViewController管理的窗口或视图,因为您只需要创建的子类NSWindowNSView新的窗口或视图的"种".例如,如果要使用圆形窗口,则可以进行子类化NSWindow.如果您只想在窗口中拥有控件,则为子类NSWindowController.

它是相同的NSViewController:通常一个NSViewController's视图将是一些基类,如NSView(或者你自己的NSView子类绘制自定义背景).该NSViewController管理该视图的子视图之间的交互,允许它作为你的更大的应用程序中的一个单元.

可以这样想:视图绘制,并将原始输入事件转换为更高级别的操作.控制器向视图提供信息并处理操作.

以这种方式组合可以大大提高代码的模块性,使其更易于设计,编写和调试.


Gir*_*ari 1

使用 UIVew 中定义的以下函数(它是现有窗口的一部分)

- (void)addSubview:(UIView *)view
- (void)removeFromSuperview
Run Code Online (Sandbox Code Playgroud)

  • 桌面 (NSView) 中提供相同的界面 (2认同)