Пользовательский метод инициализации viewController с раскадровкой

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

сейчас я делаю (в моем 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.

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

Спасибо!


person Nicolas S    schedule 18.03.2012    source источник
comment
вы все делаете правильно. вы можете переопределить initWithCoder в своем пользовательском классе, т.е. в файле класса вашего объекта _customViewController для выполнения пользовательской инициализации   -  person VJ Vélan Solutions    schedule 05.07.2013


Ответы (2)


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

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

person retainCount    schedule 23.03.2012
comment
Здорово знать, что я делаю то, что должен! - person Nicolas S; 25.03.2012
comment
Это довольно плохой дизайн, так как он заставляет вас быстро использовать опции (с !?) или получать доступ к возможным нулевым значениям, если разработчик забыл установить правильную переменную. Печально, что это подходящее решение: хороший источник по этому вопросу с необязательным параметром swift/objective c: objc.io/issue-16/power-of-swift.html - person Guilherme Silveira; 16.10.2014
comment
Просто чтобы ответить на комментарий @GuilhermeSilveira, этот вопрос был из 2012 года, когда Swift даже не был известен широкой публике, и даже если бы это было так, шаблоны проектирования между Objective-C и Swift сильно различаются, поэтому вам не следует придерживаться этого шаблона, если вы разрабатываются с помощью Swift. - person Nicolas S; 23.11.2015
comment
Существует ли шаблон для Swift, позволяющий избегать необязательных или неявно развернутых необязательных параметров для VC, загружаемого из раскадровки? - person bobics; 29.01.2016

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

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

        //invoke your data source here
    }

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

person Despotovic    schedule 05.05.2016