到目前爲止還不是很瞭解:我正在嘗試單個窗口應用程序。我可以在appDelegate中完成所有工作(到目前爲止工作正常),並且我可以有一個額外的控制器,以便我可以將UIElements從MainWindow連接到(儘管工作良好)。但是:我真正想要做的是擁有一個MainWIndow,它只有菜單,還有一個單獨的控制器和筆尖(可能甚至多於一個),隨後加載和添加。
爲了清楚起見,MainWindow是一個nib文件,所以我將它稱爲MainWindow.nib。它是在應用程序的Info.plist文件中指定的標準nib文件名,作爲應用程序啓動時要加載的nib文件。
默認情況下,Xcode創建一個包含主菜單和主窗口的MainWindow.nib文件。您可以從MainWindow.nib文件中自由刪除窗口,並有另一個nib文件來保存該窗口。我們來調用這個其他的nib文件MyWindow.nib。
使用NSWindowController或NSViewController?爲什麼? (我傾向於的viewController)
既然你將有一個單獨的榫文件來保存一個窗口,您將使用NSWindowController
。創建NSWindowController
的子類,例如MyWindowController
,它將負責控制存儲在MyWindow.nib中的窗口。這個子類將有指向該窗口中的用戶界面元素的出口,以及可能在MyWindow.nib中定義的其他對象。
這樣做時,在MyWindow中執行以下操作很重要。筆尖:
NSViewController
用於管理視圖,通常從筆尖文件加載,它並不適用於窗口。
您可以在.nib文件中重複這個窗口,NSWindowController
的子類來管理該窗口 - 根據需要設置多個窗口。
什麼,在哪裏以及如何實例化(大概在的appDelegate的didFinishLaunching?)
既然你想在你的應用程序中的一個窗口,一個選項是爲您的應用程序委託持有的引用(實例變量,聲明的屬性)到管理該窗口的單個窗口控制器。然後,在-applicationDidFinishLaunching:
中,實例化所述控制器。
例如:
// MyAppDelegate.h
@class MyWindowController;
@interface MyAppDelegate : NSObject <NSApplicationDelegate>
@property (retain) MyWindowController *myWindowController;
@end
和:
// 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)
您確定要在主窗口中添加一個窗口?如果是這樣,那將被稱爲附加窗口。你可以使用上面的機制(把窗口放在它自己的nib文件中,有一個NSWindowController
的子類來管理它,讓你原來的MyWindowController
把一個引用(實例變量,聲明的屬性)保存到附加的窗口控制器,並實例化它/ load隨附的窗口筆尖文件),然後使用-[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];
}
}
如果你想一個視圖添加到主窗口中,最簡單的方法是在筆尖文件這樣做直。
如果您需要/想以編程方式做到這一點,你需要有對視圖的引用,然後將其添加到主窗口中的內容視圖,例如:
[self.window.contentView addSubView: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];
}
}
是絕對輝煌! Thnx –
如何創建報關單?與nswindowcontroller – jkk
優秀!謝謝你的解釋! – nonamelive