2012-03-18 3 views
50

имейте проблему переопределяя метод инициализации моего CustomViewController, который разработан в моей раскадровке.viewController custom init метод с раскадровкой

теперь им делать (в моем mainViewController):

self.customViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"CustomVC"]; 
self.customViewController.myObject = someObject; 

и я имею в viewDidLoad (CustomViewController)

[self.label setText:self.myObject.someString]; 

Это работает нормально.

Но, это правильный способ? Должен ли я добавить собственный метод инициализации (или переопределить) в свой CustomViewController? Как initWithObject:? Я не знаю, как вызвать свой собственный метод инициализации вместо UIStoryboard instantiateViewControllerWithIdentifier:, и я не получаю звонки до init или initWithNibName.

Возможно, я должен использовать: - (id)initWithCoder:(NSCoder *)decoder.

Пожалуйста, дайте мне совет!

Спасибо!

+0

вы делаете Все в порядке. вы можете переопределить initWithCoder в своем пользовательском классе. i.e файл класса вашего объекта _customViewController для выполнения пользовательского init. –

ответ

58

Назначенный инициализатор для контроллеров представлений в раскадровках - -initWithCoder:. Поскольку большинство контроллеров просмотра из раскадровки создаются через segues, вы обычно видите состояние, установленное во время -prepareForSegue:sender:.

Если вы создаете экземпляр диспетчера представлений непосредственно из раскадровки, как в приведенном вами примере, то выбранный вами шаблон является подходящим.

+0

Замечательно, что я делаю то, что должно быть! –

+2

Это довольно плохой дизайн, так как он позволяет вам использовать опции в swift (с!?) Или получить доступ к возможным нилям, если разработчик забывает установить правильную переменную. Печально, что это «подходящее» решение: хороший источник по этой проблеме с быстрым/объективным с необязательным: http://www.objc.io/issue-16/power-of-swift.html –

+0

Просто чтобы ответить к комментарию @GuilhermeSilveira, этот вопрос был с 2012 года, когда быстрый даже не был известен публике, и даже если бы это было так, шаблоны проектирования были разными между Objective-C и Swift, поэтому вы не должны придерживаться этого шаблона, если вы разрабатываете Swift. –

0

Как еще один «обходной путь» для этой проблемы, вы можете использовать делегирование. Создайте протокол, который будет использоваться в качестве источника данных для вашего подкласса UIViewController из раскадровки. Соответствуют этому протоколу источника данных, реализовать его и использовать его сразу же после загрузки вашего UIViewController подкласс:

required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 

     //invoke your data source here 
    } 

Я знаю ... Я тоже не нравится, но ...;)

Смежные вопросы