1

这是这个问题的副本。

我在掌握一些 Cocoa 基础知识(特别是 Controllers 和 Delegates)时遇到了困难,所以我决定完成一个基础教程。我找到了一个“你的第一个 Mac 应用程序”,一切顺利,直到“下一步要去哪里”阶段。这里有一堆我不明白的大概是基本的东西:

>

  • “创建一个新的控制器类,并将管理轨道和用户界面从应用程序委托转移到这个新类。”

...创建一个单独的控制器类有什么意义?我得到了 MVC 模式并在过去使用过它,我只是无法弄清楚单独的 Controller 和 Delegate 的位置。

  • “在 nib 文件中创建控制器类的实例,并与它建立适当的连接,而不是与应用程序委托建立适当的连接。”

...在此之前,我只是认为我只是创建了一个 NSWindowController 的子类,然后在 .xib 文件中声明该窗口应该是该类的对象。现在我很困惑。控制器应该是什么类?它应该符合哪些接口(对不起,协议)?如果它只是我指向 outlet 的一个类,那么再一次 - 与我已经拥有的 Delegate 有什么区别?

  • “添加从应用程序委托到新控制器对象的连接。应用程序完成启动后,应用程序委托应向控制器发送消息以显示窗口。”

...消息是什么?我找到的最接近的东西是 NSWindowController 类中的 showWindow: message ,但是当我写这个时:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    [trackController showWindow:self];

}

在 AppDelegate 的 applicationDidFinishLaunching 方法中,它显示错误“接收器类型'TrackController'例如消息是前向声明',我只是不明白这是什么意思。

不仅如此——我为什么要发送一条消息来显示这个窗口,如果这个窗口没有任何我创建的代码,在一个空白项目中显示?也许我应该以某种方式关闭这个默认行为并自己创建这个窗口的一个实例?

4

1 回答 1

1

控制器类的要点:在控制器和模型元素及其用户界面之间保持一定比例是一种很好的做法。对于简单的应用程序,您可以将所有代码放在AppDelegate. 一旦您开发了更复杂的应用程序,您将希望将代码从AppDelegate各种控制器卸载,并且您将拥有用于维护模型的各种视图。我试图在视图和控制器之间保持 1:1 的关系,以使事情易于管理。

控制器可以实现各种协议来代表 UI 组件处理特定的功能位。然后他们成为该组件的代表。例如,在您的视图中,您有一个NSTextView并且您想知道用户何时单击文本中的链接。然后,您的控制器可以实现<NSTextViewDelegate>并实现该方法textView:clickedOnLink:atIndex:。通过这样做,它成为了您的NSTextView.

控制器应该是什么类?有大量控制器类可用于构建您的应用程序。我倾向于只使用NSViewController. 该控制器能够处理NSViewNSWindow. 支持的视图层次结构NSView允许您决定各种粒度场景(巨大、复杂的控制器或细粒度 - 由您决定)。

有关前向声明问题,请参阅此帖子

我不明白您在显示窗口时的最后一个问题。显然,默认模板会生成一些管道代码来显示窗口。您可以使用该代码或滚动您自己的代码。澄清如果我没有正确理解你......

于 2012-06-08T00:35:32.070 回答