简体   繁体   English

SwiftUI 在视图之间切换

[英]SwiftUI Switching between views

I have a parent view (Content View) containing an array of integers,我有一个包含整数数组的父视图(内容视图),

The view switcher function inside the parent switches the child view depending on the value of the integer in the array.父视图切换器 function 根据数组中 integer 的值切换子视图。

The issue I have is is that 'view1' is re-presented (after being presented before) the view is not redrawn and the text in the textfield remains populated.我遇到的问题是“view1”被重新呈现(在之前被呈现之后)视图没有被重绘并且文本字段中的文本仍然被填充。

How can I redraw the child view each time the switch function is called?每次调用开关 function 时,如何重绘子视图?

thanks谢谢

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")
            }
        }
    }
}

Here is possible solution.这是可能的解决方案。 Using.id modifier makes view unique per-update, so rebuilds.使用 .id 修饰符使视图在每次更新时都是唯一的,因此会重建。

Tested with Xcode 11.4 / iOS 13.4使用 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())
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM