Saya memiliki tampilan induk (Tampilan Konten) yang berisi array bilangan bulat,

Fungsi pengalih tampilan di dalam induk mengalihkan tampilan anak tergantung pada nilai bilangan bulat dalam array.

Masalah yang saya miliki adalah bahwa 'view1' disajikan kembali (setelah disajikan sebelumnya) tampilan tidak digambar ulang dan teks di bidang teks tetap terisi.

Bagaimana saya bisa menggambar ulang tampilan anak setiap kali fungsi sakelar dipanggil?

Terima kasih

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")
            }
        }
    }
}
2
MattBlack 28 Mei 2020, 22:13

1 menjawab

Jawaban Terbaik

Berikut adalah solusi yang mungkin. Menggunakan pengubah .id menjadikan tampilan unik per pembaruan, jadi buat ulang.

Diuji dengan 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())
    }
}
0
Asperi 28 Mei 2020, 19:28