NSViewController не создается

Я строю приложение какао с одним главным контроллером окна с XIB. Эта XIB содержит много пользовательских классов представления. Я хотел бы добавить NSViewController в Xib, но у меня возникли некоторые проблемы.

В конструкторе интерфейса я могу перетащить NSViewController в xib, назначить ему свой класс контроллера и назначить его представление соответствующему представлению в xib. Вот проблема: ни initWithNibName:Bundle: или же loadView позвонить

Что мне не хватает?

РЕДАКТИРОВАТЬ: Люди, кажется, неправильно понимают вопрос, поэтому я уточню.

В окне уже есть контроллер вида. То, что я пытаюсь сделать, это назначить отдельные контроллеры представления нескольким из подпредставлений. Мне нужно знать, как связать мой NSViewController подкласс с соответствующим NSView подкласс (который является дочерним по отношению к главному окну).

Или, другими словами, я пытаюсь использовать несколько NSViewController подклассы для управления многими различными пользовательскими представлениями (по одному) в одном файле.xib. Эти контроллеры и подпредставления имеют свои собственные.xibs, которые в конечном итоге должны стать видимыми в том же окне.

2 ответа

Шаблон, который я использую для NSViewController, должен иметь xib для каждого контроллера представления. Затем, когда вам нужен этот контроллер представления вы alloc это и использовать initWithNibName:Bundle: метод. Как только вы используете его вид, loadView будет вызван.

Пример:

self.editViewController = [[[MyEditViewController alloc] initWithNibName:@"MyEditViewController" bundle: nil] autorelease];
[self.window setContentView: editViewController.view];

Я тоже зацикливался на этом и отказывался от этой вещи - синего круга с белым окаймленным взглядом из палитры IB. Теперь я создаю свои контроллеры из кода и устанавливаю в IB только ссылку на владелец класса контроллера через владельца файла: щелкните правой кнопкой мыши владельца файла, введите имя класса в инспекторе удостоверений, а затем установите соединение из представления владельца файла с Посмотреть.

Затем в своем коде вы делаете в соответствующей точке инициализации:

[self setMyViewController = [[MyViewController alloc] initWithNibName: @"MyView" bundle: [NSBundle mainBundle]]

Для вашего конкретного случая это может быть в windowDidLoad метод, когда ваше окно загружено из его кончика и готово к работе. Затем вы можете добавить представление к представлению содержимого Windows. Также вы можете подумать о соотношении 1:1 между представлением и контроллером представления. Это делает жизнь намного проще с точки зрения обслуживания.

РЕДАКТИРОВАТЬ: Как @pcperini предлагает в его комментариях вы можете использовать компонент палитры, но вам все равно нужно создать экземпляр контроллера в вашем коде. Если вы хотите использовать компонент палитры, создайте свойство в главном контроллере или AppDelegate:

@property (...) MyViewController *myViewController;

Добавьте строку кода для фактического создания контроллера (см. Выше). Затем с помощью инспектора привязок свяжите компонент палитры с myViewController имущество.

Итак, вам не хватает того, что вы на самом деле не создаете экземпляр объекта контроллера.

РЕДАКТИРОВАТЬ 2: Вот код (awakeFromNib - это метод верхнего контроллера). Он создает два дочерних контроллера, каждый из которых обрабатывает свое подпредставление:

- (void) awakeFromNib {

    [[self startEndTopicHeader] setHeader: @"Event timeline boundary"];
    [[self startDateHeaderView] setHeader: @"Event (start) date"];
    [[self endDateHeaderView] setHeader: @"Event end date"];

    [self setStartDateViewController: [[EventTimeViewController alloc] initWithNibName: @"EventTimeView" bundle: [NSBundle mainBundle]]];
    [[[self startDateViewController] view] setFrame: [[self dummyStartView] bounds]];
    [[self dummyStartView] addSubview: [[self startDateViewController] view]];
    [[self startDateViewController] setParentController: self];

    [self setEndDateViewController: [[EventTimeViewController alloc] initWithNibName: @"EventTimeView" bundle: [NSBundle mainBundle]]];
    [[[self endDateViewController] view] setFrame: [[self dummyEndView] bounds]];
    [[self dummyEndView] addSubview: [[self endDateViewController] view]];
    [[self endDateViewController] setParentController: self];

}
Другие вопросы по тегам