Пока не понято: я пробую приложение в одном окне.Я могу сделать все в appDelegate (до сих пор работает нормально), и у меня может быть дополнительный контроллер, к которому я могу подключить UIElements из MainWindow (работает пока хорошо).НО: то, что я действительно хотел бы сделать, это иметь MainWIndow, который имеет только меню, и отдельный контроллер и перо (возможно, даже больше, чем один из них позже), которые загружаются и добавляются впоследствии.
Для ясности, MainWindow - это nib-файл, поэтому я буду называть его MainWindow.nib.Это стандартное имя файла пера, указанное в файле Info.plist приложения в качестве файла пера, который будет загружен при запуске приложения.
По умолчанию Xcode создает файл MainWindow.nib, который содержит как главное меню, так иглавное окно.Вы можете удалить окно из файла MainWindow.nib и иметь другой файл пера для хранения этого окна.Давайте назовем этот другой файл пера MyWindow.nib.
Использовать NSWindowController или NSViewController?И почему?(Я бы предпочел viewController)
Поскольку у вас будет отдельный nib-файл для хранения окна , вы будете использовать NSWindowController
.Создайте подкласс NSWindowController
, например MyWindowController
, который будет отвечать за управление окном, хранящимся в MyWindow.nib.У этого подкласса будут выходы, указывающие на элементы пользовательского интерфейса в этом окне и потенциально на другие объекты, которые вы определяете в MyWindow.nib.
При этом важно, чтобы вы сделали следующее в MyWindow.nib:
NSViewController
используется для управления представлением, обычно загружаемым из файла пера, и это не относится к окнам.
Вы можете повторить это - окно вфайл .nib, подкласс NSWindowController
для управления этим окном - для стольких окон, сколько необходимо.
Что, где и как создавать экземпляры (предположительно в didFinishLaunching appDelegate?)
Поскольку вы хотите, чтобы в вашем приложении было одно окно, один из вариантов для делегата приложения должен содержать ссылку (переменная экземпляра, объявленное свойство) на контроллер единого окна, который управляет этим окном.Затем в -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
содержит ссылку (переменная экземпляра, объявленное свойство) на подключенный оконный контроллер исоздайте его / загрузите прикрепленный файл пера окна при необходимости), а затем используйте -[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];
Вы можете создать someView
программно или загрузить его из отдельного файла пера,В последнем случае процедура очень похожа на описанную выше, но вместо использования подкласса 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];
}
}