Типичный подход, применяемый, когда нужно передать/поделиться переменными между контроллерами представления (используя раскадровки), состоит в том, чтобы получить ссылку на целевой 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?