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];
}