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