Заводская инициализация с добавлением дополнительных свойств

В моем демонстрационном проекте я заменил ручное создание контроллера представления на заводское создание в сборке, например так (как продемонстрировал Джаспер Блюз здесь: https://stackoverflow.com/a/24227246/397898)

// ApplicationAssembly

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

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

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

        definition.scope = TyphoonScope.Singleton
    }
}

// PersonListAssembly

dynamic func personListViewController() -> AnyObject {

        return TyphoonDefinition.withFactory(self.applicationAssembly.mainStoryboard(), selector: "instantiateViewControllerWithIdentifier:", parameters: {
            (factoryMethod) in

            factoryMethod.injectParameterWith("PersonListViewController")
        })
    }

Но контроллер представления все еще нуждается в некоторых других зависимостях. Как я могу ввести свойство при этом?

И на самом деле у меня есть два вопроса: все IBOutlets равны нулю, когда я пытаюсь использовать контроллер представления вот так. Я что-то пропустил?

Правильный ответ на основе ответа Джаспера

dynamic func personListViewController() -> AnyObject {

    return TyphoonDefinition.withClass(PersonListViewController.self) {
        (definition) in

        definition.factory = self.applicationAssembly.mainStoryboard()
        definition.useInitializer("instantiateViewControllerWithIdentifier:", parameters: { (factoryMethod) in

            factoryMethod.injectParameterWith("PersonListViewController")
        })

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

person Sebastian Wramba    schedule 31.10.2014    source источник


Ответы (1)


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

- (id)currentTheme
{
    return [TyphoonDefinition withClass:[PFTheme class] 
        configuration:^(TyphoonDefinition* definition)
    {
        definition.factory = [self themeFactory];
        [definition useInitializer:@selector(sequentialTheme)];
    }];
}

. . когда вы используете этот подход:

  • Инициализатор (с аргументами или без них) на самом деле является методом экземпляра объекта, который создаст компонент.
  • Могут быть установлены дополнительные свойства, область действия и т. д.

Мы создали короткий путь, поскольку обращение к «инициализатору», который на самом деле является методом экземпляра класса, создающего компонент, немного сбивает с толку. Похоже, что при добавлении блока конфигурации произошла оплошность.

person Jasper Blues    schedule 31.10.2014
comment
Большое спасибо. Я обновлю текст своего вопроса, чтобы предоставить правильный код, который я использую сейчас. - person Sebastian Wramba; 31.10.2014