这是this问题的重复。
我在抓住一些Cocoa fundementals(特别是Controllers和Delegates)时遇到了麻烦,所以我决定完成一个基础教程。我找到了“你的第一台Mac应用程序”,一直顺利到“Where To Next”阶段。以下是一些我不了解的基本内容:
>
- “创建一个新的控制器类,然后移动以管理从应用程序委托到此新类的轨道和用户界面。”
......创建单独的控制器类有什么意义?我得到MVC模式并在过去使用它,我只是想不出那里单独的Controller和Delegate那里。
- “在nib文件中创建一个控制器类的实例,并与之建立适当的连接,而不是与应用程序委托之间的连接。”
...在此之前我只是想我只创建了NSWindowController的子类,然后在.xib文件中声明该窗口应该是该类的对象。现在我被消费了。控制器应该是什么类?它应符合哪些接口(对不起,协议)?如果它只是一个我指向出口的课程,那么再一次 - 与我已经拥有的代表有什么不同?
- “从应用程序委托添加到新控制器对象的连接。当应用程序完成启动时,应用程序委托应该向控制器发送一条消息以显示窗口。”
......消息是什么?我发现最接近的是showWindow:NSWindowController类中的消息,但是当我写这个:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[trackController showWindow:self];
}
在AppDelegate的applicationDidFinishLaunching方法中,它显示错误“接收器类型'TrackController'例如消息是一个前向声明',我只是无法理解它是什么意思。
更重要的是 - 为什么我要发送一条消息来显示这个窗口,如果这个窗口显示没有任何代码,我在一个空白项目中创建了所有代码?也许我应该以某种方式关闭这个默认行为并自己创建一个这个窗口的实例?
答案 0 :(得分:1)
控制器类的要点:在控制器和模型元素及其用户界面之间保持一定比例是一种好习惯。对于简单的应用程序,您可以将所有代码放在AppDelegate
中。一旦开发出更复杂的应用程序,您将需要将代码从AppDelegate
卸载到各种控制器,并且您将拥有各种视图来维护模型。我尝试在视图和控制器之间保持1:1的关系,以保持事务的可管理性。
控制器可以实现各种协议来代表UI组件处理特定的功能位。然后他们成为该组件的代表。例如,在您的视图中,您有一个NSTextView
,并且您想知道用户何时单击文本中的链接。然后,您的控制器可以实现<NSTextViewDelegate>
并实施方法textView:clickedOnLink:atIndex:
。通过这样做,它成为了NSTextView
。
控制器应该是什么类?有很多控制器类可用于构建您的应用程序。我倾向于只使用NSViewController
。此控制器能够处理NSView
中显示的NSWindow
个实例。 NSView
支持的视图层次结构允许您决定各种粒度场景(巨大的,复杂的控制器或细粒度 - 由您决定)。
有关前向声明问题,请参阅this post。
我不明白你显示窗口的最后一个问题。显然,默认模板会生成一些管道代码来显示窗口。您可以使用该代码或滚动自己的代码。澄清我是否理解不正确...