Как использовать несколько раскадровок, определенных в сборках?

Я использую разные раскадровки для разных вариантов использования. Мой вопрос заключается в том, как мне создать экземпляр раскадровки, контроллера представления по его идентификатору раскадровки и подключить его к реальному классу view controller?

Вот где я сейчас нахожусь:

public dynamic func loadingViewController() -> AnyObject {
    return TyphoonDefinition.withClass(LoadingViewController.self) {
        (definition) in

        definition.injectProperty("presenter", with: self.loadingPresenter())
    }

//        return TyphoonDefinition.withFactory(self.storyboard(), selector: "instantiateViewControllerWithIdentifier:") {
//            (factory) in
//            
//            factory.injectParameterWith("LoadingViewController")
//            
//        }
}

public dynamic func storyboard() -> AnyObject {
    return TyphoonDefinition.withClass(TyphoonStoryboard.self) {
        (definition) in

        definition.useInitializer("storyboardWithName:factory:bundle:") {
            (initializer) in

            initializer.injectParameterWith("Loading")
            initializer.injectParameterWith(self)
            initializer.injectParameterWith(NSBundle.mainBundle())
        }

        definition.scope = TyphoonScope.Singleton
    }
}

В этом примере имя раскадровки - "Загрузка", view controller - "Загрузка ViewController", а идентификатор раскадровки - "Загрузка ViewController".

Любая помощь (или пример кода) будет принята с благодарностью!

1 ответ

Решение

Чтобы создать TyphoonDefinition, представляющий UIViewController, который будет генерироваться из раскадровки:

Создайте определение для раскадровки:

- (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]];
            }];
    }];
}


Если вы хотите создать экземпляр контроллера, помеченного как "начальный" контроллер в раскадровке:

- (UIViewController *)initialControllerFromStoryBoard
{
    return [TyphoonDefinition withFactory:[self storyboard] 
        selector:@selector(instantiateInitialViewController)];
}


Если вы хотите создать экземпляр другого контроллера в раскадровке:

- (UIViewController *)arbitraryControllerFromStoryboard
{
    return [TyphoonDefinition withFactory:[self storyboard] 
        selector:@selector(instantiateViewControllerWithIdentifier:)

        parameters:^(TyphoonMethod *factoryMethod) {
            [factoryMethod injectParameterWith:@"ViewControllerId"];
        }];
}

Извините за ответ в Objective-C, но в данный момент у меня нет свиных отбивных.

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