SwiftUI 在视图之间切换

Posted

技术标签:

【中文标题】SwiftUI 在视图之间切换【英文标题】:SwiftUI Switching between views 【发布时间】:2020-05-28 19:13:01 【问题描述】:

我有一个包含整数数组的父视图(内容视图),

父视图切换器函数根据数组中整数的值切换子视图。

我遇到的问题是“view1”被重新呈现(在之前被呈现之后)视图没有被重绘并且文本字段中的文本仍然被填充。

如何在每次调用 switch 函数时重绘子视图?

谢谢

struct ContentView: View 

    var views =  [2,1,1]
    @State var currentView = 0

    var body: some View 

        VStack
            viewSwitcher()
        
    

    func viewSwitcher() -> AnyView 
        switch views[currentView] 
        case 1:
            return AnyView(view1(currentView: self.$currentView))
        case 2:
            return AnyView(view2(currentView: self.$currentView))
        default:
            return AnyView(EmptyView())
        
    



struct view1:View 

    @State var textInput: String = ""
    @Binding var currentView: Int

    var body: some View 
        VStack

            Text("View 1")

            TextField("Enter Text", text: self.$textInput)

            Button(action: 
                self.currentView += 1
            )
                Text("Submit")
            
        
    


struct view2:View 

    @Binding var currentView: Int

    var body: some View 

        VStack
            Text("View 2")
            Button(action: 
                self.currentView += 1
            )
                Text("Submit")
            
        
    

【问题讨论】:

【参考方案1】:

这是可能的解决方案。使用 .id 修饰符使视图在每次更新时都是唯一的,因此会重新构建。

使用 Xcode 11.4 / ios 13.4 测试

func viewSwitcher() -> AnyView 
    switch views[currentView] 
    case 1:
        return AnyView(view1(currentView: self.$currentView).id(UUID()))
    case 2:
        return AnyView(view2(currentView: self.$currentView).id(UUID()))
    default:
        return AnyView(EmptyView())
    

【讨论】:

以上是关于SwiftUI 在视图之间切换的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI点击任意文本在只读与可编辑之间随意切换的实现

SwiftUI NavigationView 切换色调颜色

使用 SwiftUI 在不同的 UI 层次结构之间切换的正确方法是啥?

SwiftUI之HStack和VStack的切换

SwiftUI之HStack和VStack的切换

如何在同一个“主”视图中切换 2 个不同的视图? SwiftUI