1

这是this问题的复制品。可可教程故障

我在抓取一些可可功能(特别是控制器和代表)方面遇到困难,所以我决定完成一个基本的教程。我找到了“你的第一台Mac应用程序”,并且一直运行良好,直到“Where To Next”阶段。这里有一堆大概基本的东西,我不知道这件事:

>

  • “创建一个新的控制器类和移动从应用程序委托管理跟踪和用户界面到这个新班级。“

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

  • “创建笔尖文件中的控制器类的实例,并作出适当的连接,并从它,而不是从应用程序的委托。”

...在此之前这一点上我只是想,我只是创建NSWindowController的一个子类,然后在文件的.xib该窗口应该是这个类的对象申报。现在我很困惑。控制器应该是什么类?应该遵循什么接口(对不起,协议)?如果这只是我指出的一类,那么再一次 - 与我已经有的代表有什么不同?

  • “添加从应用程序委托给新的控制器对象。当应用程序已完成启动,则应用程序委托应该将消息发送到所述控制器,以显示窗口的连接”。

...什么信息?我发现的最接近的是的ShowWindow:消息NSWindowController类,但是当我写这篇文章:

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

    [trackController showWindow:self]; 

} 
在AppDelegate中的的applicationDidFinishLaunching方法

,它显示例如消息错误“接收器类型‘TrackController’是一个向前声明”,我只是不明白这是什么意思

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

回答

1

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

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

控制器应该是什么类?有大量的控制器类可用于构建您的应用程序。我倾向于只使用NSViewController。该控制器能够处理显示在NSWindow中的NSView的实例。 NSView支持的视图层次允许您决定各种粒度情况(巨大的,复杂的控制器或细粒度 - 这取决于您)。

对于前向声明问题,请参阅this post

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