故事板 - 对象内部的对象作为 IBOutlet

Storyboard - Object inside an object as IBOutlet

我正在阅读 this 关于 MVVM 模式的很好的教程,以一个简单的 api 调用为例。这是 故事板 UIViewController 的最终结构:

VC:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var viewModel: ViewModel!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}  

VM:

import UIKit

class ViewModel: NSObject {
    @IBOutlet weak var client: ApiClient!
}

ApiClient:

import UIKit

class ApiClient: NSObject {

}  

观察:

自始至终,我了解到 ViewModel(考虑 MVVM)永远不应该有 UIKit 引用。尽管对 MVVM 使用 Storyboards 证明有不同的结果。因为我们在 ViewModel 中使用 IBOutlet

查询:

Storyboard 和对象 IBOutlet 用于 MVVM 是否正确?

提到:

I have learnt that ViewModel (considering MVVM), should never has UIKit reference.

似乎并不总是正确的,这不是创建视图模型时的标准经验法则,因此如果仅需要导入 UIKit 来将 属性 声明为 IBOutlet,这也不错。

我相信提到视图不应该导入 UIKit 的目的是因为我们想要一个 精确的 视图模型,这意味着我们不想通过让视图模型 - 无意中 - 处理 "View" 层职责来打破 MVVM 模式的原则,通过避免在视图模型中导入 UIKit,我们可以保证这样的冲突不会发生'不会发生;毫无疑问,作为开发人员的您能够认识到这种冲突...

尽管如此,您仍然可以通过将 client 声明为:

从视图模型中删除 import UIKit
var client: ApiClient!

不将其标记为 IBOutlet,因此您需要以编程方式注入它,而不是通过情节提要进行注入。