2010-07-17 39 views
6

所以我开始学习如何使用可可。我想我已经知道了,但我很想创建和切换视图。我正在改写一个我以前做过的游戏。我只想要一个窗口(最好不能调整大小),我希望能够在游戏中切换不同屏幕的视图。如何在Cocoa应用程序中切换视图?

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

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

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

在此先感谢大家,我真的很困惑这是如何工作的。在UIVew(这是你现有的窗口的一部分)

- (void)addSubview:(UIView *)view 
- (void)removeFromSuperview 

回答

1

使用以下功能用于新的“种类”窗口或视图。例如,如果你想使用圆形窗口,你可以继承NSWindow。如果您只想在窗口中进行控制,您可以子类NSWindowController

这是一个与NSViewController一样的:一般的NSViewController's看法会有一些基类,如NSView(或者你自己NSView子类,绘制一个自定义的背景)。 NSViewController管理该视图的子视图之间的交互,使其在您的大型应用程序中充当单个单元。

这样想:视图绘制,他们把原始输入事件变成更高层次的动作。控制器向视图提供信息,并处理操作。

用这种方式编写东西可以大大提高代码的模块性,使设计,编写和调试变得更容易。

+0

我正在桌面上做可可。 – 2010-07-17 18:42:25

+2

桌面(NSView)中提供了相同的界面 – 2010-07-17 18:52:45

+0

所以我想知道的是为什么我应该使用NSViewController。我是不是该?我应该使用NSView和NSViewController变量创建NSWindowController的子类吗?我不确定用可切换视图创建窗口真的有什么必要。根据我的理解,我根本不需要NSViewController,但是我不知道,因为Apple的例子使用了它,它应该会让事情变得更容易。 – 2010-07-17 19:25:08

5

您使用NSWindowControllerNSViewController管理窗口或视图,因为您只需要创建的NSWindowNSView子类中定义

+0

我想这样做更有意义。你认为我不得不使用'initWithNibName:bundle:'来加载视图,或者我可以将视图的“文件所有者”设置为ViewController吗? – 2010-07-17 21:16:43

+0

你需要同时做两件事。你可以使用'-initWithNibName:bundle:'来实例化你的NSViewController子类。加载指定的nib文件并充当它的文件所有者;将笔尖的文件所有者的类设置为您的NSViewController子类,并在您的视图中指向文件所有者的“视图”插座。 – 2010-07-18 19:19:58

4

这听起来像你想换出一个窗口内的内容视图?如果是这种情况,您可以使用-[NSView replaceSubview:with:]-[NSWindow contentView]作为接收器。

假设您有一个名为titleView的标题页面和一个名为menuView的菜单页面,并且您希望将这些内容交换出应用程序的主窗口。如果标题页是可见的,用户点击“主菜单”按钮或链接,你会把这样的事情在按钮的委托方法:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView]; 

有两件事情需要注意的:

  1. 在这种情况下,旧视图titleView由此调用释放。如果你希望它仍然可用,你将不得不在retain之前更换它。
  2. 如果您的网页有不同的尺寸,父视图将不会调整大小。更改窗口的框架大小,因此contentView很容易,但是您可以在混合中添加一点核心动画以给它一些样式。

我希望这有助于!

+0

好的,谢谢!我也会考虑这一点。你们都很有帮助。 – 2010-07-18 14:15:04

0

我是新来的可可,但我认为你的应用程序并不需要一个NSViewController。 NSViewController在MVC设计模式中扮演“控制器”的角色。所以它在单个视图中控制着所有的动作 - 胶合逻辑。例如,在具有多个控件(按钮,表格,复选框:,textfields日期选取器等)的视图中,可能需要绑定和更新的那些控件之间的详细交互。例如,按钮单击加载数据库提取,并进行错误处理和验证。该粘合逻辑进入NSViewController类。

在您的应用中,听起来每个视图都是一个简单的页面,几乎不需要视图级别控制。因此,您可能需要一个NSWindowController,一个控制器来处理从页面到页面转换的逻辑和事件。

处理填充单个窗口的多个视图的一种技术是使用NSTabView并在IB中将选项卡样式设置为“无边框”。然后使用按钮操作选择所需的NSTabViewItem。在开发过程中,将tabview样式设置为“顶部选项卡”,IB允许您通过要显示的子视图选项卡。

相关问题