gpt4 book ai didi

ios - View 如何更新 View Controller ?

转载 作者:IT王子 更新时间:2023-10-29 05:41:25 25 4
gpt4 key购买 nike

我从 CS193P 课上学习了 Swift。它为 ViewController FaceViewController 推荐以下 API 来更新其 View FaceView:

var expression = FacialExpression(eyes: .Closed, eyeBrows: .Relaxed, mouth: .Smirk) {
didSet {
updateUI() // Model changed, so update the View
}
}

但是,我还没有看到这个概念在 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 作为您的公共(public) API,并将后备存储作为您的私有(private)状态。 Swift 也可以使用计算变量来使用这种方法,但我相信 Swift 设计者的想法有所不同。

那么,对于 View Controller 来说,在响应 View 更新时表示状态更改,同时还向其他人公开合理的读/写 API 以检查其状态的合适方法是什么?

最佳答案

我还观看了 cs193p 2017 年冬季视频。对于 FaceIt 应用程序,mdoel 需要转换为它将如何显示在 View 上。它不是 1 到 1 翻译,而是更像是 3 到 2 或类似的东西。这就是为什么我们有辅助方法 updateUI(_:)

至于 view controller 如何根据 view 的变化更新 model 的问题。在此示例中,我们无法更新模型,因为我们需要弄清楚如何将 2 个值映射到 3 个值?如果我们想要持久化,我们可以将 view state 存储在 core datauserDefaults 中。

在更通用的设置中,模型更改需要更新 View View 更改需要更新模型,那么我们需要indirection 以避免像您想象的那样cycle

例如,因为 FacialExpression 是一个值类型。我们可以有类似的东西:

private var realExpression = FacialExpression(eyes: .Closed, eyeBrows: .Relaxed, mouth: .Smirk)
var expression: FacialExpression {
get { return realExpression }
set {
realExpression = newValue
updateUI() // Model changed, so update the View
}
}

}

然后在您的假想委托(delegate) UIFaceViewDelegate 中,我们可以有以下内容:

// Implementing an imaginary delegate UIFaceViewDelegate
func faceView(_ faceView: FaceView, didEpdateExpressionTo expression: FacialExpression {
self.realExpression = expression
// This WILL NOT triggers another update to the view, and AVOID THE possibly of infinite recursion

关于ios - View 如何更新 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44488276/

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