Переопределение инициализатора по умолчанию при использовании раскадровки (внедрение зависимостей конструктора)

Типичный подход, применяемый, когда нужно передать/поделиться переменными между контроллерами представления (используя раскадровки), состоит в том, чтобы получить ссылку на целевой viewcontroller в методе prepareForSegue: и использовать внедрение свойства следующим образом:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"Segue_Name"])
    {
        // Get reference to the target view controller (optional casting)
        DestinationViewController *vc = (DestinationViewController *)segue.destinationViewController;

        // Pass any objects/properties
        vc.whateverObject = object;
}

}

Проблема с этим подходом (как я вижу его в контексте домена, с которым я имею дело в текущем проекте) заключается в том, что зависимость от передаваемого/внедряемого объекта не является явной.

Хотя такая свобода (возможность внедрения зависимостей после инициализации) приветствуется в некоторых случаях использования, где требуется гибкость, в большинстве случаев я предпочитаю чувство безопасности, которое обеспечивает внедрение конструктора.

Особенно в таком языке, как Objective-C, где передача и отправка сообщений в nil разрешены/распространены, поиск ошибок, когда я забыл установить свойство в нужном месте, утомительно даже с модульными тестами, чтобы поддержать меня.

Я хотел бы знать, есть ли способ использовать собственный инициализатор, который я мог бы предоставить с таким количеством аргументов/зависимостей, которые мне нужны.

Есть ли способ вручную управлять инициализацией segue.destinationViewController?


person joakim    schedule 23.04.2014    source источник


Ответы (1)


Насколько я знаю, вы не можете. Если вы хотите свою пользовательскую инициализацию, вы должны сделать это без переходов - используя init, сохраните DestinationViewController вручную и сделайте с ним все, что вам нужно, pushViewController или presentViewController.

Еще один недостаток использования segue заключается в том, что DestinationViewController будет каждый раз создаваться заново.

person sash    schedule 23.04.2014
comment
Это то, о чем я думал. Думаю, мне придется придерживаться внедрения метода/свойства или реорганизовать мой код, чтобы программно обрабатывать переходы. - person joakim; 23.04.2014
comment
Или выберите золотую середину и используйте метод инъекции. Таким образом, я могу потерять явные/ясные способы внедрения конструктора, убедившись, что мои объекты никогда не будут в недопустимом состоянии. - person joakim; 23.04.2014