3

我有一个故事板,其中有一个使用插座连接到他的控制器的视图。在同一个控制器中,我想注入一个需要访问该视图的对象。我不想手动将该视图传递给对象,而是想自动注入它,但我不知道如何以及是否可以使用当前代码结构实现这一目标。

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 
    }
}

我认为这与运行时参数和循环依赖有关

4

1 回答 1

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
  • 创建loadingViewModelview注入的定义。
  • 在创建loadingViewController, and 因此后view,将 注入loadingViewModel作为最后一步。

我不记得在调用之前是否清除了范围池performAfterInjections。如果是,您可能需要将范围设置为loadingViewControllertoTyphoonScopeWeakSingleton而不是 default TyphoonScopeObjectGraph

由于 Typhoon 和 Storyboards 之间的相互作用,在 eg 中手动提供实例可能会更简单viewDidLoad。但是你能试试上面的方法然后回复我吗?

于 2015-01-26T07:15:46.907 回答