2015-01-23 1 views
3

У меня есть раскадровка, которая имеет вид в ней, подключенный к его контроллеру с помощью розетки. В том же контроллере я хочу вставить объект, которому нужен доступ к этому представлению. Вместо того, чтобы передавать это представление вручную объекту, я хотел бы добавить его автоматически, но я не знаю, как и если я могу достичь этого с помощью текущей структуры кода.Тайфун Раскадровка: вставить IBOutlet Просмотр зависимости от контроллера

class LoadingViewController: UIViewController { 
    @IBOutlet weak var loadingView: UIActivityIndicatorView! 
    private(set) var loadingViewModel: LoadingViewModel! // Dependency Injection 
} 

// Assembly 

dynamic func loadingViewController() -> AnyObject { 
    return TyphoonDefinition.withClass(LoadingViewController.self) { 
     (definition) in 
     definition.injectProperty("loadingViewModel", with:self.loadingViewModel()) 
    } 
} 

dynamic func loadingViewModel() -> AnyObject { 
    return TyphoonDefinition.withClass(LoadingViewModel.self) { 
     (definition) in 
     definition.injectProperty("loadingView", with:???) // I want loadingViewController.loadingView 
    } 
} 

Я думаю, что это что-то делать с аргументами времени выполнения и циклическую зависимость

ответ

1

Это хороший один. Мы должны рассмотреть жизненный цикл между созданными Storyboard объектами и Typhoon.

Вы пробовали что-то вроде:

//The view controller 
dynamic func loadingViewController() -> AnyObject { 
    return TyphoonDefinition.withClass(LoadingViewController.self) { 
     (definition) in 
     definition.injectProperty("loadingViewModel",  
      with:self.loadingViewModel()) 
     definition.performAfterInjections("setLoadingViewModel", arguments:) { 
      (TyphoonMethod) in 
      method.injectParameterWith(self.loadingViewModel()) 
     } 
    } 
} 

dynamic func view() -> AnyObject { 
    return TyphoonDefinition.withFactory(self.loadingViewController(), 
     selector:"view") 
} 

dynamic func loadingViewModel() -> { 
    return TyphoonDefinition.withClass(SomeClass.class) { 
     (definition) in 
     definition.injectProperty("view", with:self.view()) 
    } 
} 
  • Создает определение для зрения, поручив Typhoon, что она будет излучаемый из loadingViewController
  • Создает определение для loadingViewModel, который имеет view впрыскивается.
  • После того как loadingViewController, и поэтому view был создан, введите loadingViewModel в качестве последнего шага.

Я не помню, очищается ли пул видимости до вызова performAfterInjections. Если есть, вам может потребоваться установить область loadingViewController в TyphoonScopeWeakSingleton вместо значения по умолчанию TyphoonScopeObjectGraph.

Из-за взаимодействия между Typhoon и Storyboards было бы проще просто предоставить экземпляр вручную, например, viewDidLoad. Но можете ли вы дать выше попытку и вернуться ко мне?

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