到目前为止还不明白:我正在尝试一个单一窗口应用程序。我可以在 appDelegate 中做所有事情(到目前为止工作正常),并且我可以有一个额外的控制器,我可以将 UIElements 从 MainWindow 连接到(虽然到目前为止工作正常)。但是:我真正想做的是有一个 MainWIndow,它只有菜单,以及一个单独的控制器和笔尖(以后可能甚至不止一个),随后加载和添加。
为了清楚起见,MainWindow 是一个 nib 文件,因此我将其称为 MainWindow.nib。它是应用程序的 Info.plist 文件中指定的标准 nib 文件名,作为应用程序启动时要加载的 nib 文件。
默认情况下,Xcode 创建一个 MainWindow.nib 文件,其中包含主菜单和主窗口。您可以从 MainWindow.nib 文件中删除该窗口,并使用另一个 nib 文件来保存该窗口。我们将这个另一个 nib 文件称为 MyWindow.nib。
使用 NSWindowController 还是 NSViewController?为什么? (我倾向于查看控制器)
因为你将有一个单独的 nib 文件来保存window,你将使用NSWindowController
。创建一个子类NSWindowController
, e.g. MyWindowController
,它将负责控制存储在 MyWindow.nib 中的窗口。该子类将具有指向该窗口中的用户界面元素的出口,以及您在 MyWindow.nib 中定义的潜在其他对象。
执行此操作时,请务必在 MyWindow.nib 中执行以下操作:
NSViewController
用于管理视图,通常从 nib 文件加载,不适用于 Windows。
您可以在 .nib 文件中重复此操作,窗口是NSWindowController
管理该窗口 - 根据需要管理多个窗口。
实例化什么、在哪里以及如何实例化(大概是在 appDelegate 的 didFinishLaunching 中?)
由于您希望应用程序中有一个窗口,因此一种选择是让应用程序委托保存对管理该窗口的单个窗口控制器的引用(实例变量、声明的属性)。然后,在-applicationDidFinishLaunching:
,实例化所述控制器。
例如:
// MyAppDelegate.h
@class MyWindowController;
@interface MyAppDelegate : NSObject <NSApplicationDelegate>
@property (retain) MyWindowController *myWindowController;
@end
and:
// MyAppDelegate.m
#import "MyAppDelegate.h"
#import "MyWindowController.h"
@implementation MyAppDelegate
@synthesize myWindowController;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
self.myWindowController = [[[MyWindowController alloc]
initWithWindowNibName:@"MyWindow"] autorelease];
[self.myWindowController showWindow:self];
}
…
@end
如果您想要更多窗口,只需声明实例变量/属性来保存相应的控制器并像上面那样实例化控制器即可。
如何将窗口或视图添加到唯一的主窗口,而不是拥有第二个独立窗口(我还没有准备好使用 multiDocumentApps)
您确定要添加window到主窗口?如果是这样,那就被称为附加窗口。您可以使用上面的机制(将窗口放在自己的 nib 文件中,有一个子类NSWindowController
要管理它,请拥有您的原始版本MyWindowController
保留对附加窗口控制器的引用(实例变量、声明的属性),并在适当时实例化它/加载附加窗口 nib 文件),然后使用-[NSWindow - addChildWindow:ordered:]
将辅助窗口附加到主窗口。
例如,考虑到MyWindowController
有申报财产secondaryWindowController
,在 MyWindowController.m 中:
- (void)someAction:(id)sender {
// If the secondary window hasn't been loaded yet, load it and add its
// window as a window attached to the main window
if (self.secondaryWindowController == nil) {
self.secondaryWindowController = [[[MySecondaryWindowController alloc]
initWithWindowNibName:@"MySecondaryWindow"] autorelease];
[[self window] addChildWindow:self.secondaryWindowController.window
ordered:NSWindowAbove];
}
}
如果您想向主窗口添加视图,最简单的方法是直接在 nib 文件中执行此操作。
如果您需要/想要以编程方式执行此操作,则需要引用视图,然后将其添加到主窗口的内容视图,例如:
[self.window.contentView addSubView:someView];
您可以创建someView
以编程方式或从单独的 nib 文件加载它。在后一种情况下,该过程与上面描述的非常相似,但不是使用NSWindowController
你会使用一个子类NSViewController
.
例如,在 MyWindowController.m 中:
- (void)anotherAction:(id)sender {
// If the view hasn't been loaded yet, load it and add it
// as a subview of the main window's content view
if (self.someViewController == nil) {
self.someViewController = [[[MyViewController alloc]
initWithNibName:@"MyView" bundle:nil] autorelease];
// You'll probably want to set the view's frame, e.g.
// [self.someViewController.view setFrame:...];
[self.window.contentView addSubview:self.someViewController.view];
}
}