Добавление видов или окон в MainWindow - PullRequest
12 голосов
/ 22 сентября 2011

Я спотыкаюсь о некоторых основных понятиях, которые я не могу понять.Надеюсь, кто-нибудь может кое-что прояснить для меня, так как я не нашел ресурса, который бы это объяснил.ИЛИ, может быть, он при ярком открытии, и я его просто не вижу.

Пока что понятно: MainWindow содержит меню и, следовательно, более или менее важно.info.plist содержит перо, которое загружается при запуске приложения.

Пока не понято: я пробую приложение из одного окна.Я могу сделать все в appDelegate (до сих пор работает нормально), и у меня может быть дополнительный контроллер, к которому я могу подключить UIElements из MainWindow (работает пока хорошо).НО: то, что я действительно хотел бы сделать, это иметь MainWIndow, который имеет только меню, и отдельный контроллер и перо (возможно, даже больше, чем оба из них позже), которые загружаются и добавляются впоследствии.

Мои вопросы:

  • Использовать NSWindowController или NSViewController?И почему?(Я бы использовал NSViewController)

  • Что, где и как создавать экземпляры (предположительно в didFinishLaunching приложения appelegate?)

  • Как добавить окно или представление к одному-единственному главному окну вместо второго независимого окна (я еще не готов к multiDocumentApps)

Большое спасибо,любые мысли приветствуются!

1 Ответ

22 голосов
/ 22 сентября 2011

Пока не понято: я пробую приложение в одном окне.Я могу сделать все в 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:

  • Задайте для владельца файла тип MyWindowController;

  • Соедините выход window в владельце файла с объектом окна.

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];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...