gpt4 book ai didi

swift - @State 与 @ObservableObject - 哪个以及何时?

转载 作者:行者123 更新时间:2023-12-04 00:20:07 25 4
gpt4 key购买 nike

我目前正在熟悉 SwiftUI 和 Combine 框架。而且我并没有真正理解这两种方法之间的区别。当我们必须跟踪一些数据(例如,任务列表)时,我们可以声明一个@State 变量,它的变化会自动发送通知并更新当前 View 。但是,看起来也可以通过这种方式完成:

class TaskList: ObservableObject{
//a list that's going to be modified and updated on different occasions
@Published var list: [String]
}

class TodoListView {
@ObservedObject var todoList = TaskList()
}

所以,我错过了一点 - @State 和 @ObservedObject 方法有何不同,在哪种情况下更可取?

谢谢!

最佳答案

如果您将任何变量标记为 @State在 SwiftUI 中 View并将它们绑定(bind)到 body 中的属性其中View , body将在 @State 时重新计算变量变化,因此你的整个 View将被重绘。另外,@State变量应作为 View 的唯一真实来源.由于这些原因,@State变量只能从 body 中访问和更新。的 View因此应声明为 private .
您应该使用 @State当您绑定(bind)一些用户输入时(例如 TextField 的值或从 Picker 中选择的值)。 @State应该用于 值类型 (struct 秒和 enum 秒)。
另一方面,@ObservedObject应该用于引用类型(class es),​​因为它们会触发刷新 View ,只要有 @Published ObservableObject 的属性(property)变化。
您应该使用 @ObservedObject当您有一些数据从您的View 外部传入时,例如在带有 SwiftUI 的 MVVM 架构中,您的 ViewModel应存储为 @ObservedObject在您的 View 上.@ObservedObject 的常见错误s 是在 View 中声明和初始化它们。本身。这将导致问题,因为每次 @ObservedObject发出更新(其中一个 @Published 属性被更新), View 将被重新创建 - 这也将创建一个新的 @ObservedObject , 因为它是在 View 中初始化的本身。为了避免这个问题,每当你使用 @ObservedObject ,你总是必须将其注入(inject) View . iOS 14 @StateObject解决了这个问题。

关于swift - @State 与 @ObservableObject - 哪个以及何时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61361788/

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