在 SwiftUI 中,@State
和 @ObservedObject
是常用的属性包装器,用于管理视图的状态和数据。如果你发现数据的 changed
属性没有刷新界面,可能是以下几个原因:
@State
或 @ObservedObject
确保你的数据使用了正确的属性包装器。例如:
struct ContentView: View {
@State private var text = "Hello, World!"
var body: some View {
VStack {
Text(text)
Button("Change Text") {
self.text = "New Text"
}
}
}
}
ObservableObject
如果你使用的是 @ObservedObject
,确保你的数据模型遵循 ObservableObject
协议,并且使用了 @Published
属性包装器来标记可观察的属性。例如:
class DataModel: ObservableObject {
@Published var text = "Hello, World!"
}
struct ContentView: View {
@ObservedObject var model = DataModel()
var body: some View {
VStack {
Text(model.text)
Button("Change Text") {
self.model.text = "New Text"
}
}
}
}
确保你在视图之间正确传递了 @ObservedObject
。例如:
struct ContentView: View {
@ObservedObject var model = DataModel()
var body: some View {
VStack {
Text(model.text)
DetailView(model: self.model)
}
}
}
struct DetailView: View {
@ObservedObject var model: DataModel
var body: some View {
Button("Change Text") {
self.model.text = "New Text"
}
}
}
确保你在更新数据时没有出现逻辑错误。例如,如果你在某个闭包中更新数据,确保闭包正确捕获了外部变量。
class DataModel: ObservableObject {
@Published var text = "Hello, World!"
func updateText() {
DispatchQueue.main.async {
self.text = "New Text"
}
}
}
@StateObject
替代 @ObservedObject
在某些情况下,使用 @StateObject
可能更合适,特别是在视图的生命周期内需要创建和管理对象时。
struct ContentView: View {
@StateObject private var model = DataModel()
var body: some View {
VStack {
Text(model.text)
Button("Change Text") {
self.model.text = "New Text"
}
}
}
}
@State
管理视图内部的临时状态。@ObservedObject
和 @StateObject
管理与视图外部的数据源绑定。以下是一个完整的示例,展示了如何正确使用 @State
和 @ObservedObject
:
import SwiftUI
class DataModel: ObservableObject {
@Published var text = "Hello, World!"
}
struct ContentView: View {
@State private var localText = "Hello, Local World!"
@ObservedObject var model = DataModel()
var body: some View {
VStack {
Text(localText)
Button("Change Local Text") {
self.localText = "New Local Text"
}
Text(model.text)
Button("Change Model Text") {
self.model.text = "New Model Text"
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
通过以上方法,你应该能够解决 SwiftUI 中数据变化未刷新界面的问题。
领取专属 10元无门槛券
手把手带您无忧上云