(Cocoa)在单个窗口可可应用程序中,UIViewController子类的等价物是什么?

时间:2012-04-12 11:54:06

标签: objective-c cocoa nswindowcontroller

在搞乱iOS应用程序后,我想我会给一个Cocoa应用程序一个旋转,假设事情会非常相似。所以我有一个单独的窗口应用程序,有一个拆分视图和一些NSTableView s(想想iTunes),我正在寻找一个放置我的代码的地方,这些代码将从网上获取数据以填充表格。

在iOS中,我会将其放在相应viewDidLoad子类的UIViewController方法中。然后UITableViewDataSource将访问此数据以填充其单元格。

现在我有一个NSWindow我可以做类似的事情,但我该怎么做NSWindowController呢?这甚至是我想要的吗?我可以把它放在AppDelegate中,但似乎不对。

1 个答案:

答案 0 :(得分:12)

iOS和OS X之间的区别在于iOS中只有一个窗口,但OS X中可能有多个窗口。在OS X中NSViewControllersUIViewControllers的工作方式不同NSViewController设计用于加载和处理单个视图,而UIViewControllers(对于我相对缺乏iOS知识的道歉)似乎处理多个视图并提供更多视图之间的粘合剂。

即使是Apple docs也写了:

  

在Mac OS X中,AppKit视图控制器是窗口的助手   控制器,它最终负责所有事情   在窗口。

因此,OS X中UIViewController的对应部分不是NSViewController,而是NSWindowController,它确实为OS X提供了UIViewController为iOS所做的大部分工作通过管理整个单个窗口以及内部视图的布局/内容/交互。

在您的情况下,我会使用NSWindowController - 但如果应用程序非常简单,App Delegate也可以使用;如果应用程序非常复杂,那么使用NSViewController分割代码并不是一个坏主意。

使用NSWindowController的最佳方式是使用[[CustomWindowController alloc] init]

以编程方式将其加载到App Delegate中
@implementation CustomWindowController
- (id)init
{
    self=[super initWithWindowNibName:@"CustomWindowNibName"];
    if(self)
    {
        //perform any initializations
    }
    return self;
}
@end

或致电

[[CustomWindowController alloc] initWithWindowNibName:@"CustomWindowNibName"];

直接(并覆盖initWithWindowNibName),如果您希望它可以重复使用。

您可以删除MainMenu.xib中的默认窗口。


从根本上说,NSWindowController通常管理在其自己的nib文件中实例化的窗口。 NSWindowController通常拥有该nib文件。 (虽然可以让它管理一个以编程方式创建的窗口,但通常不会这样做。)

为了能够使用自定义NSWindowController,您需要在单独的nib / xib文件中进行窗口管理。 (使用默认的xib文件意味着你允许Cocoa自动实例化NSWindowController而没有子类化的机会;你不能使用默认NSMainNibFile的自定义NSWindowController。对于一个简单的应用程序,只需将所有控制器代码放在NSApplication中/ App代表)

至少在Xcode 4中,该过程涉及使用窗口模板和自定义NSWindowController类创建一个xib,在-init或者任何地方基于该nib实例化CustomWindowController类,然后调用{ {1}}(或者,如果这不起作用,[CustomWindowController showWindow:self];)以使窗口实际显示(在-makeKeyAndOrderFront:中可能是一个不错的地方)。

要停止显示默认窗口,我只需将其删除即可。可能有更好的方法,但我不知道。