导航到它时刷新视图

时间:2020-10-29 02:16:47

标签: swift swiftui

在SwiftUI 2中,当我从父视图导航到子视图然后返回到父视图时,父视图不会刷新其内容。如何强制它刷新其内容?

为了测试内容是否刷新,在父视图中,我使用以下代码显示了一个随机数:

Text("Random number is \(Int.random(in: 1..<100))")

当我导航到子视图时,然后点击导航栏中的“后退”按钮以返回到该父视图,显示的随机数保持不变。这表明视图没有刷新。

每当用户导航回视图时,如何强制视图刷新自身?

2 个答案:

答案 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
            }
    }
}