代码之家  ›  专栏  ›  技术社区  ›  dicle

视图控制器中的依赖项注入

  •  5
  • dicle  · 技术社区  · 6 年前

    我正在尝试使用依赖注入,而不是遵循单例。这就是我努力实现的目标。当我运行应用程序时,我遇到了一个错误 "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。敏捷的

    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")
    }
    }
    
    2 回复  |  直到 6 年前
        1
  •  6
  •   Jakub Vano    6 年前

    事实上 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功能外,它还能够向从情节提要初始化的视图控制器注入依赖项。

        2
  •  0
  •   Bio-Matic    6 年前

    你为什么打电话 super.init(nibName: nil, bundle: nil)? 在ViewController初始化方法中? 打个电话就行了 super.init() 它应该会修复。