我有一个故事板,其中有一个视图,使用插座连接到他的控制器。 在同一个控制器中,我想注入一个需要访问该视图的对象。而不是手动将该视图传递给对象我想自动注入它,但我不知道如何以及如果我可以用当前的代码结构实现它。
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
}
}
我认为它与运行时参数和循环依赖
有关答案 0 :(得分: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())
}
}
loadingViewController
发出它loadingViewModel
注入的view
创建定义。loadingViewController
后创建view
后,请注入loadingViewModel
作为最后一步。 在调用performAfterInjections
之前,我不记得范围池是否已清除。如果是,您可能需要将loadingViewController
的范围设置为TyphoonScopeWeakSingleton
,而不是默认TyphoonScopeObjectGraph
。
由于Typhoon和Storyboard之间的相互作用,在viewDidLoad
中手动提供实例可能更为简单。但你可以尝试上面的尝试并回复我吗?