SwiftUI不重绘视图的问题



在处理我的第一个SwiftUI项目时,当我开始将一些更复杂的视图移动到它们自己的视图结构中时,我开始遇到视图没有被重新绘制的问题。

例如,我有以下超视图:

struct ContainerView: View {
@State var myDataObject: MyDataObject?

var body: some View {
if let myDataObject = myDataObject {
TheSmallerView(myDataObject: myDataObject)
.padding(.vertical, 10)
.frame(idealHeight: 10)
.padding(.horizontal, 8)
.onAppear {
findRandomData()
}
}
else {
Text("No random data found!")
.onAppear {
findRandomData()
}
}

}
private func findRandomData() {
myDataObject = DataManager.shared.randomData
}
}

现在,当第一次绘制时,我在屏幕上获得了Text视图,因为myDataObject变量为nil,但调用了其中的.onAppear,并用实际的结构设置了myDataStruct。我在body变量中添加了断点,我看到当这种情况发生时,它会被再次调用,并进入第一个if子句并获取";TheSmallerView;视图,但屏幕上不会重新绘制任何内容。它仍然显示以前的"文本"视图。

我在这里错过了什么?

编辑:以下是TheSmallerView:的相关部分

struct TheSmallerView: View {
@ObservedObject var myDataObject: MyDataObject

第2版:修正了代码以更好地反映我的实际代码。

尝试在TheSmallerView视图中声明@Binding var myDataStruct: MyDataStruct,并像这样传递:ContainerView中的TheSmallerView(myDataStruct: $myDataStruct)

您在子视图中使用@ObservedObject,但该属性包装器仅用于类(并且您的数据是一个结构)。

您可以使用@State(b/c数据是一个结构)

编辑:数据不是结构。因为它是一个类,所以应该使用@StateObject而不是@State

由于缺乏完整的代码,我基于OP代码创建了这个简单的例子,它按照预期的方式工作得很好。所以问题似乎在其他地方。

class MyDataObject: ObservableObject {
@Published var number: Int

init() {
number = Int.random(in: 0...1000)
}
}

struct ContentView: View {
@State var myDataObject: MyDataObject?

var body: some View {
if let myDataObject = myDataObject {
TheSmallerView(myDataObject: myDataObject)
.onAppear {
findRandomData()
}
}
else {
Text("No random data found!")
.onAppear {
findRandomData()
}
}
}
private func findRandomData() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
myDataObject = MyDataObject()
}
}
}
struct TheSmallerView: View {
@ObservedObject var myDataObject: MyDataObject

var body: some View {
Text("The number is: (myDataObject.number)")
}
}

最新更新