2014-10-31 2 views
1

В моем демо-проекте я заменил ручное создание контроллера представления с созданием фабрики на базе в сборке, как так (как Jasper Blues продемонстрировал здесь: https://stackoverflow.com/a/24227246/397898)инициализация фабрики с введением Additonal собственности

// 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()) 
    } 
} 

ответ

1

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

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

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

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

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

+0

Отлично, спасибо. Я обновлю свой текст вопроса, чтобы предоставить правильный код, который я использую сейчас. –

Смежные вопросы