【发布时间】:2017-11-13 06:30:15
【问题描述】:
我从 CS193P 课程中学习了 Swift。它建议 ViewController FaceViewController 使用以下 API 来更新其视图 FaceView:
var expression = FacialExpression(eyes: .Closed, eyeBrows: .Relaxed, mouth: .Smirk) {
didSet {
updateUI() // Model changed, so update the View
}
}
但是,当视图更新自己的模型时,我还没有看到此概念的扩展。例如这没有意义:
// Implementing an imaginary delegate UIFaceViewDelegate
func faceView(_ faceView: FaceView, didEpdateExpressionTo expression: FacialExpression {
self.expression = expression
// This triggers another update to the view, and possibly infinite recursion
}
在 Objective-C 中,这非常简单,因为您可以使用 getter 和 setter 作为您的公共 API,并将后备存储用作您的私有状态。 Swift 也可以使用计算变量来使用这种方法,但我相信 Swift 设计者有不同的想法。
那么,对于视图控制器来说,什么是合适的方式来表示状态更改以响应视图更新,同时公开一个合理的读/写 API 供其他人检查其状态?
【问题讨论】:
-
您的意思是像在
layoutSubviews()中那样更新视图控制器中的视图吗? -
为什么
self.expression = expression没有意义?它是如何创建递归的?
标签: ios swift model-view-controller