在SwiftUI 2中,当我从父视图导航到子视图然后返回到父视图时,父视图不会刷新其内容。如何强制它刷新其内容?
为了测试内容是否刷新,在父视图中,我使用以下代码显示了一个随机数:
Text("Random number is \(Int.random(in: 1..<100))")
当我导航到子视图时,然后点击导航栏中的“后退”按钮以返回到该父视图,显示的随机数保持不变。这表明视图没有刷新。
每当用户导航回视图时,如何强制视图刷新自身?
答案 0 :(得分:1)
SwiftUI是声明性的-正如您在定义视图可能处于的状态时一样,Swift UI将照顾何时更新。在您的示例中,状态没有变化,因此视图不会更新。
如果要刷新视图,则需要更新出现事件的状态。您可以这样做:
struct ContentView: View {
@State var intValue: Int = 0
var body: some View {
Text("Random number is \(self.intValue)")
.onAppear {
intValue = Int.random(in: 1..<100)
}
}
}
您会发现,如果使用NavigationView / NavigationLink推送不同的视图,然后向后导航,则标签应使用新的随机值进行更新。
答案 1 :(得分:1)
您可以通过使用@State 变量(在本例中称为“viewID”)向源视图添加 .id(viewID) 视图修饰符来强制 SwiftUI 更新列表。然后在目标视图的 .onDisappear() 中更新此 viewID:
struct ContentView: View {
@State private var viewID: Int = 0
var body: some View {
NavigationView {
VStack {
Text("Hello, random world number \(Int.random(in: 1...100))")
.padding()
.id(viewID)
NavigationLink(
destination: destinationView,
label: { labelView })
}
}
}
private var labelView: some View {
Text("Go to Destination View")
}
private var destinationView: some View {
return Text("I am the Destination.")
.onDisappear{
viewID += 1
}
}
}