所以我开始学习如何使用Cocoa。我想我已经得到了它,但我已经挂断了创建和切换视图。我正在改写我之前做过的练习游戏。我想要的只是一个窗口(最好不能调整大小),我希望能够在游戏中切换不同屏幕的视图。
首先,我有主菜单(开始游戏,高分,退出)。然后我需要一个窗口为每个屏幕(游戏屏幕,高分屏幕)。
我对此感到困惑的是如何设计它。我查找了NSViewController,认为它管理视图,但事实并非如此。它只通过加载它来管理一个视图。我不明白为什么我需要使用NSViewController。难道我不能只有一个包含多个NSView子类的窗口类并加载它们吗?我不确定我是否理解ViewController的目的。
我的Window类是否真的需要子类化NSWindowController?我试图按照Apple的ViewController示例的例子,它有一个窗口控制器类,它是NSWindowController的子类。我没有看到子类化的目的是什么。所有NSWindowController似乎都添加了- initWithPath:(NSString *)newPath
,但是当我可以编辑plist文件以在启动时打开窗口时,我无法看到它的用途。 Apple的例子还有一个NSView变量和一个NSViewController变量。您是否只需要一个变量来存储当前视图?
先谢谢你们,我真的很困惑这是怎么回事。
答案 0 :(得分:6)
听起来你正试图在窗口中换掉内容视图?如果是这种情况,您可以使用-[NSView replaceSubview:with:]
-[NSWindow contentView]
作为接收方。
假设您有一个名为titleView
的标题页和一个名为menuView
的菜单页,您想要将它们交换进应用程序的主窗口。如果标题页可见并且用户点击“主菜单”按钮或链接,您可以在按钮的委托方法中输入类似的内容:
[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView];
要注意两件事:
titleView
。retain
很容易,但您可以在混合中添加一些核心动画,以赋予它一些风格。我希望这有帮助!
答案 1 :(得分:5)
您使用NSWindowController
和NSViewController
来管理窗口或视图,因为您只需要为窗口的新“种类”创建NSWindow
或NSView
的子类或查看。例如,如果要使用圆形窗口,则可以继承NSWindow
。如果您只想在窗口中拥有控件,则继承NSWindowController
。
与NSViewController
相同:通常,NSViewController's
视图将属于某些基类,例如NSView
(或者您自己的NSView
子类,它们会绘制自定义背景)。 NSViewController
管理该视图的子视图之间的交互,使其在较大的应用程序中充当单个单元。
以这种方式思考:视图绘制,并将原始输入事件转换为更高级别的操作。控制器向视图提供信息并处理操作。
通过这种方式进行组合可以极大地提高代码的模块性,使其更易于设计,编写和调试。
答案 2 :(得分:1)
使用UIVew中定义的以下功能(它是现有窗口的一部分)
- (void)addSubview:(UIView *)view
- (void)removeFromSuperview
答案 3 :(得分:0)
我是cocoa的新手,但我认为你的应用并不需要NSViewController。 NSViewController在MVC设计模式中扮演“Controller”的角色。因此它在一个视图中“控制”所有动作 - 胶合逻辑。
例如,在具有多个控件的视图中:按钮,表格,复选框:,文本字段日期选择器等,可能需要绑定和更新的控件之间的详细交互。例如,按钮单击会加载数据库提取,并进行错误处理和验证。胶合逻辑进入NSViewController类。
在您的应用中,听起来每个视图都是一个简单的页面,几乎不需要视图级别控制。因此,您可能需要一个NSWindowController,一个控制器来处理从页面到页面转换的逻辑和事件。
处理填充单个窗口的多个视图的一种技术是使用NSTabView并在IB中将选项卡样式设置为“无边框”。然后使用按钮操作选择所需的NSTabViewItem。在开发过程中,将tabview样式设置为“顶部选项卡”,IB允许您通过要显示的子视图进行选项卡。