iOS和OS X的区别在于iOS中只有一个窗口,而OS X中可以有多个窗口。在OS X中,
NSViewController
与
UIViewController
的工作方式不同,
NSViewController
设计用于加载和处理单个视图,而
UIViewController
似乎处理多个视图并提供更多的视图之间的黏合剂。即使是
Apple文档也写道:
在Mac OS X中,AppKit视图控制器是窗口控制器的助手,后者最终负责窗口中的所有内容。
因此,在OS X中,
UIViewController
的对应物不是
NSViewController
,而是
NSWindowController
,它通过管理单个窗口及其视图内的布局/内容/交互,在OS X上提供了类似于
UIViewController
为iOS提供的功能。
在这种情况下,我会使用
NSWindowController
- 虽然如果应用程序非常简单,也可以使用
App Delegate
; 如果应用程序非常复杂,则使用
NSViewController
拆分代码不是坏主意。
使用
NSWindowController
的最佳方法是在App Delegate中使用
[[CustomWindowController alloc] init]
进行编程加载。
@implementation CustomWindowController
- (id)init
{
self=[super initWithWindowNibName:@"CustomWindowNibName"];
if(self)
{
}
return self;
}
@end
或者调用
[[CustomWindowController alloc] initWithWindowNibName:@"CustomWindowNibName"];
如果你想让NSWindowController可重用,你可以直接使用initWithWindowNibName来覆盖它。
你可以在MainMenu.xib文件中删除默认的窗口。
通常情况下,NSWindowController管理在其自己的nib文件中实例化的窗口。 NSWindowController通常拥有该nib文件。(尽管有可能使其管理以编程方式创建的窗口,但通常不是这样做的。)
因此,要能够使用自定义NSWindowController
,您需要在单独的nib / xib文件中制作要管理的窗口。(使用默认的xib文件意味着您允许Cocoa自动实例化一个NSWindowController而没有机会进行子类化;您不能使用自定义NSWindowController
与默认的NSMainNibFile。对于简单的应用程序,只需将所有控制器代码放在NSApplication/App Delegate中即可)
在至少Xcode 4中,这个过程涉及创建一个具有窗口模板和自定义NSWindowController
类的xib,根据那个nib实例化基于CustomWindowController
类,在-init或其他位置调用[CustomWindowController showWindow:self];
(如果这样不起作用,则使用-makeKeyAndOrderFront:
)来显示窗口(在-(void)applicationDid/WillFinishLaunching:(NSNotification *)aNotification
中可能是一个很好的地方)。
要停止默认窗口显示,我只需删除它。可能有更好的方法,但我不知道。
self=[super initWithWindowNibName:@"MainWindowController"];
。我在应用程序委托的applicationDidFinishLaunching
方法中实例化了我的MainWindowController属性,使用mainWindow = [[MainWindowController alloc] init];
。没有错误,但是没有窗口。我有什么遗漏的吗? - TijuanaKez[[CustomWindowController alloc] initWithWindowNibName:@"CustomWindowNibName"];
之后,[CustomWindowController showWindow:self];
可以工作,但[CustomWindowController.window makeKeyAndOrderFront:nil]
无法工作。 - TijuanaKez-makeKeyAndOrderFront:
的理解有误,但很高兴你找到了正确的解决方案。 - Vervious