NSViewController не создается - PullRequest
       2

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

0 голосов
/ 05 февраля 2012

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

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

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

EDIT: Люди, кажется, неправильно понимают вопрос, поэтому я уточню.

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

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

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

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

Пример:

self.editViewController = [[[MyEditViewController alloc] initWithNibName:@"MyEditViewController" bundle: nil] autorelease];
[self.window setContentView: editViewController.view];
0 голосов
/ 05 февраля 2012

Я тоже зацикливался на этом и отказывался от этой вещи - синего круга с белым окаймленным видом из палитры 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];

}
...