我是iOS开发的新手。我需要为UIViewController
注入注入的依赖项和服务,而不是在init()
或viewDidLoad()
方法中创建它们。看起来像这样:
// Initialize View Controller
let viewController = ViewController()
// Configure View Controller
viewController.requestManager = RequestManager()
我的问题是:
MyUIViewController
的外观如何?我应该使用init()
方法吗? 注1:我不使用任何类型的容器。我需要使用纯男人DI。
注意2:在ASP.NET MVC中,我们所说的内容与IControllerFactory
类似。
答案 0 :(得分:3)
如果您使用UIStoryboardSegue
转换到新的视图控制器,则可以在-prepareForSegue:
回调中进行设置,包括依赖注入。从故事板加载视图控制器并初始化之后,但在加载任何视图之前,会发生这种情况。例如:
- (void)prepareForSegue:(UIStoryboardSegue *)segue {
MyViewController * vc = (MyViewController *)segue.destinationViewController;
vc.injectedProperty1 = [InjectedObject new];
vc.injectedProperty2 = [OtherInjectedObject new];
}
答案 1 :(得分:2)
为了能够将依赖项注入视图控制器,您必须继承UIViewController并创建自定义init函数。
以SO帖子为例: how-do-i-make-a-custom-initializer-for-a-uiviewcontroller
因此,在您的UIViewController子类中,您将拥有一个自定义init,如:
init(requestManager: RequestManager)
{
self.requestManager = requestManager
super.init(nibName: nil, bundle: nil)
}
并且您在其中创建MyUIViewController的实例:
let myRequestManager = RequestManager()
let viewController = MyUIViewController(requestManager: myRequestManager)
答案 2 :(得分:2)
BNR书籍没有提及工厂方法的原因是iOS应用程序不会(通常)使用它们来创建视图控制器。如果您是iOS开发的新手,并且沿着这条路走下去,您应该再考虑一下您的应用结构。
最好开始使用故事板,并在呈现视图控制器的prepare(for segue: UIStoryboardSegue)
方法中分配属性。 e.g。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let viewController = segue.destination as? MyViewController {
viewController.requestManager = requestManager
}
}
虽然您当然可以覆盖必需的init?(coder aDecoder: NSCoder)
...
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
requestManager = RequestManager()
}