我正在尝试使用依赖注入而不是跟随单身。这就是我想要实现的目标。当我运行应用程序时,我在"No "decodeObject" candidates produce the expected contextual result type "ModelManager"
上遇到错误。任何想法如何以正确的方式实现依赖注入?
我的模特课:
class ModelManager {
var results: MyCustomClass
init(results: MyCustomClass) {
self.results = results
}
func update(customDataInfo: MyCustomClass!) {
self.results = customDataInfo
}
}
MyViewController.swift
class MyViewController: UIViewController {
private let modelManager: ModelManager
init(modelManager: ModelManager) {
self.modelManager = modelManager
super.init(nibName: nil, bundle: nil)
self.modelManager.modelManagerUpdate = self as ModelManagerUpdate
}
required init?(coder aDecoder: NSCoder) {
self. modelManager = aDecoder.decodeObject(value(forKey: "modelManager") as ModelManager)
super.init(coder: aDecoder)
fatalError("init(coder:) has not been implemented")
}
override func encode(with aCoder: NSCoder) {
super.encode(with: aCoder)
aCoder.encode(self. modelManager, forKey: "modelManager")
}
}
答案 0 :(得分:4)
正在使用init?(coder:)
初始化程序的事实表明您的视图控制器是从故事板初始化的。如果是这种情况,故事板不包含ModelManager
,因此无法对其进行解码。
您可以通过将故事板初始化包装到您自己的方法中来解决此问题,例如:
class MyViewController: UIViewController {
private var modelManager: ModelManager
static func create(modelManager: ModelManager) -> MyViewController {
let vc = /* instantiate vc from storyboard */
vc.modelManager = modelManager
return vc
}
}
如果上述方法不符合您的需求,我建议您查看SwinjectStoryboard框架。它提供 - 除了基本的DI功能 - 能够将依赖关系注入到从故事板初始化的视图控制器。
答案 1 :(得分:0)
为什么在ViewController init方法中调用super.init(nibName: nil, bundle: nil)?
?
只需致电super.init()
即可修复。