在弄乱了 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]
和
@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/