Контроллер представления FooViewController
должен выполнить некоторую инициализацию при его создании (само по себе, а не управляемого представления - до того, как представление даже будет загружено).
Я хочу иметь возможность создать его двумя способами:
Программно, возможно с некоторыми аргументами:
FooViewController *fooViewController = [[[FooViewController alloc] initWithSomeData:data] autorelease];
[self.navigationController pushViewController:fooViewController animated:YES];
В Интерфейсном Разработчике.
Для (1) я бы написал инициализаторы так:
- (id)initWithSomeData:(Data *)data // designated initializer
{
if (self = [super initWithNibName:@"FooView" bundle:nil]) {
self.title = "Foo";
// perform initialization
}
return self;
}
- (id)init
{
return [self initWithSomeData:nilOrSomeDefaultValue];
}
// ... other initializers that call the designated initializer
(Я жестко прописываю имя пера, поскольку контроллер всегда использует одну и ту же конфигурацию представления и потому, какое представление он использует, вообще не касается вызывающих абонентов)
При создании в Интерфейсном Разработчике я бы хотел, чтобы конечный результат был таким же, как если бы объект был инициализирован без параметров init
.
Теперь, если я просто сделаю:
- (id)initWithCoder:(NSCoder *)decoder
{
return [self init];
}
Свойства title
, wantsFullScreenLayout
и nibName
, установленные в Инспекторе в Интерфейсном Разработчике, будут игнорироваться, но это нормально. NibName жестко закодировано в init
, и там устанавливается title
на случай, если контроллер в любом случае создается программно.
Проблема в том, что parentViewController
не установлен (по умолчанию initWithCoder:
установит его на основе иерархии объектов в NIB).
Как я могу получить родительский объект из пера? Затем я бы изменил initWithCoder:
на что-то вроде:
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [self init]) {
_parentViewController = [decoder parentObject];
}
return self;
}
Или я должен использовать какой-то другой подход для создания контроллеров, которые могут быть созданы как программно, так и в IB?