Тайфун вводит свойство в контроллер вида из раскадровки

У меня есть несколько контроллеров, и я использовал 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]];
            }];
    }];
}

И предоставьте эту раскадровку любому компоненту, который в ней нуждается.

Другие вопросы по тегам