8

在弄乱了 iOS 应用程序之后,我想我应该试一试 Cocoa 应用程序,假设事情会非常相似。所以我有一个带有拆分视图和一些NSTableViews(想想 iTunes)的单窗口应用程序,我正在寻找一个放置我的代码的地方,该代码将从网络获取数据以填充表格。

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

现在我有一个NSWindow我可以为它做类似的事情但我如何为它做一个NSWindowController?这甚至是我想要的吗?我可以把它放进去,AppDelegate但似乎不对。

4

1 回答 1

10

iOS 和 OS X 之间的区别在于 iOS 中只有一个窗口,但 OS X 中可以有多个窗口NSViewControllers。iOS 知识)似乎可以处理多个视图并在视图之间提供更多的粘合剂。UIViewControllersNSViewControllerUIViewControllers

甚至Apple 文档也这样写道:

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

因此,UIViewControllerOS X 中的对应物不是NSViewController,而是NSWindowController,它UIViewController通过管理单个窗口的整体以及其中视图的布局/内容/交互,为 OS X 提供了许多为 iOS 提供的功能。

在你的情况下,我会使用NSWindowController- 虽然如果应用程序非常简单,那么App Delegate也可以;如果应用程序非常复杂,那么使用 aNSViewController来拆分代码不会是一个坏主意。

使用 an 的最佳方法是以NSWindowController编程方式将其加载到 App Delegate 中,使用[[CustomWindowController alloc] init]and

@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 文件。(虽然可以让它管理一个以编程方式创建的窗口,但这通常不是这样做的。)

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

至少在 Xcode 4 中,该过程涉及使用窗口模板和自定义类创建一个 xib,在 -init 或任何地方基于该 nibNSWindowController实例化该类,然后调用(或者如果这不起作用,)来获取窗口实际展示(可能是一个不错的地方)。CustomWindowController[CustomWindowController showWindow:self];-makeKeyAndOrderFront:- (void)applicationDid/WillFinishLaunching:(NSNotification *)aNotification

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

于 2012-04-12T17:00:04.220 回答