View Controller中的依赖注入

dic*_*cle 5 model-view-controller singleton dependency-injection swift

我正在尝试使用依赖注入而不是跟随单例。这就是我想要达到的目的。当我运行应用程序时,我在此上出现错误"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
}
}
Run Code Online (Sandbox Code Playgroud)

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")
}
}
Run Code Online (Sandbox Code Playgroud)

Jak*_*ano 5

使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果上述方法不适合您的需求,建议您看一下SwinjectStoryboard框架。除了基本的DI功能之外,它还提供了将依赖项注入到从情节提要中初始化的视图控制器的功能。