objective-c - (Cocoa) 单窗口 Cocoa 应用程序中的 UIViewController 子类等效于什么?

标签 objective-c cocoa nswindowcontroller

在弄乱了 iOS 应用程序之后,我想我会试一试 Cocoa 应用程序,假设事情会非常相似。因此,我有一个带有 Split View和一些 NSTableView(想想 iTunes)的单窗口应用程序,我正在寻找一个地方来放置我的代码,这些代码将从 Web 获取数据以填充表格。

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

现在我有一个 NSWindow,我可以为它做类似的事情,但是我如何为它制作一个 NSWindowController?这就是我想要的吗?我可以将它放在 AppDelegate 中,但似乎不正确。

最佳答案

iOS 和 OS X 的区别在于,iOS 中只有一个窗口,但 OS X 中可以有多个窗口。NSViewControllers 在 OS X 中的工作方式不同于 UIViewControllers NSViewController 旨在加载和处理单个 View ,而 UIViewControllers(抱歉我相对缺乏 iOS 知识)似乎可以处理多个 View 并提供更多 View 之间的粘合。

即使是 Apple docs写下:

In Mac OS X, AppKit view controllers are assistants to the window controller, which is ultimately responsible for everything that goes in the window.

因此,OS X 中 UIViewController 的对应物不是 NSViewController,而是 NSWindowController,它确实为 OS X 提供了很多功能UIViewController 通过管理整个单个窗口和其中 View 的布局/内容/交互为 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 而没有机会进行子类化;您不能使用自定义 NSWindowController 和默认的 NSMainNibFile。对于一个简单的应用程序,只需将所有 Controller 代码在 NSApplication/App Delegate 中)

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

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

关于objective-c - (Cocoa) 单窗口 Cocoa 应用程序中的 UIViewController 子类等效于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10123045/

相关文章:

objective-c - 交换 View - NSWindowController 和 NSViewController

swift - 如何在代码中调用用户事件

iphone - Objective-C 中的删除线字体

objective-c - UITextField是否在UIAlertView中替代?

objective-c - 如何使用 Core Plot 设置图表宽度?

ios - 未调用 UIPageViewController 委托(delegate)方法

objective-c - 将整数转换为格式化字符串

c++ - 操作系统-X : check if process runs from bundle or not

objective-c - 如何使文本标签显示表格中有多少行

objective-c - 如何使用 NSViewController 识别 modalForm 窗口