gpt4 book ai didi

swift - View Controller 中的依赖注入(inject)

转载 作者:搜寻专家 更新时间:2023-10-30 23:07:52 27 4
gpt4 key购买 nike

我正在尝试使用依赖注入(inject)而不是遵循单例。这就是我想要实现的目标。当我运行应用程序时,我在 "No "decodeObject"candidates produce the expected contextual result type "ModelManager" 上遇到错误。知道如何以正确的方式实现依赖注入(inject)吗?

我的模型类:

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")
}
}

最佳答案

正在使用 init?(coder:) 初始化程序的事实表明您的 View Controller 是从 Storyboard 中初始化的。如果是这种情况, Storyboard不包含 ModelManager,因此无法对其进行解码。

您可以通过将 Storyboard初始化包装到您自己的方法中来解决这个问题,例如:

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 功能 - 能够将依赖项注入(inject)从 Storyboard初始化的 View Controller 。

关于swift - View Controller 中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49147047/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com