故事板 - 对象内部的对象作为 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
,因此您需要以编程方式注入它,而不是通过情节提要进行注入。
我正在阅读 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
,因此您需要以编程方式注入它,而不是通过情节提要进行注入。