Тайфун вводит свойство в контроллер вида из раскадровки
У меня есть несколько контроллеров, и я использовал Typhoon, чтобы ввести объект как свойство в эти контроллеры. Я использовал Plist Integration. Я обнаружил, что иногда объект не вводился в контроллеры представления, как ожидалось.
Например, MainTabBarController - это начальный контроллер представления, а SplashViewController - это другой контроллер представления. Я ввел объект как свойство в коде. Проверено, что объект введен в MainTabBarController.
В какой-то момент мне нужно представить SplashViewController из MainTabBarController следующим образом:
SplashViewController *vc = [[UIStoryboard storyboardWithName:@"Main"
bundle:[NSBundle mainBundle]]
instantiateViewControllerWithIdentifier:@"SplashNavigationController"];
[self presentViewController:vc
animated:YES
completion:nil];
Когда я попытался получить доступ к объекту в SplashViewController, это не удалось. Свойство не содержит объект.
После некоторого расследования я обнаружил, что раскадровка, которую я получил, вызвав [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]], НЕ была TyphoonStoryboard, но у MainTabBarController - TyphoonStoryboard. Поэтому я изменил его на:
SplashViewController *vc = [self.storyboard
instantiateViewControllerWithIdentifier:@"SplashNavigationController"];
[self presentViewController:vc
animated:YES
completion:nil];
И тогда SplashViewController содержит внедренный объект. Я хотел бы подтвердить, ожидается ли такое поведение, и это правильный подход для решения такого рода проблем.
Большое спасибо!
1 ответ
Да, это ожидаемое поведение. Если вы используете интеграцию plist:
- Раскадровка (если есть) определяется как
UILaunchStoryboardName
в списке ваших приложений будет экземпляр TyphoonStoryboard, который работает так же, как обычная раскадровка, с дополнительным преимуществом, заключающимся в том, что зависимости вводятся в соответствии со сборками, определенными в вашем списке. - Для программного создания дополнительных раскадровок, как это делают некоторые люди, например, для разделения раскадровок на варианты использования, требуется экземпляр
TyphoonStoryBoard
для внедрения зависимости.
Если вы хотите определить эту раскадровку в сборке, вы можете сделать что-то вроде:
- (UIStoryboard *)storyboard
{
return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(storyboardWithName:factory:bundle:)
parameters:^(TyphoonMethod *initializer) {
[initializer injectParameterWith:@"StoryboardName"];
[initializer injectParameterWith:self];
[initializer injectParameterWith:[NSBundle mainBundle]];
}];
}];
}
И предоставьте эту раскадровку любому компоненту, который в ней нуждается.