Programovo Prezentácia a Prepúšťanie Názory SwiftUI

0

Otázka

Pracujem na projekte, ktorý sa snaží prezentovať a odvoláva názory v NavigationView pomocou štátu a záväzné. Dôvod, prečo robím to je je chyba v @Prostredia(.presentationMode) var presentaionMode: Záväzné model. To spôsobuje, podivné správanie. Je to popísané v tomto príspevku tu.

Príklad má tri názory, ktoré sa postupne naložené na zobrazenie. Prvé dve ContentView na NavView1 prítomný a odvoláva dokonale. Však, akonáhle NavView2 je naložené na tlačidlo sa používa na prepínanie stavu presentNavView2 skončí pridaním iného NavView2 pohľad na seba a nie zamietol ako sa očakávalo. Akékoľvek myšlienky na to, prečo by to bolo?

ContentView

struct ContentView: View {
    @State private var presentNavView1 = false
    
    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: NavView1(presentNavView1: self.$presentNavView1), isActive: self.$presentNavView1, label: {
                    Button(action: {
                        self.presentNavView1.toggle()
                    }, label: {
                        Text("To NavView1")
                    }) // Button
                }) // NavigationLink
            } // List
            .navigationTitle("Home")
        } // NavigationView
    } // View
}

NavView1

struct NavView1: View {
    
    @State private var presentNavView2 = false
    
    @Binding var presentNavView1: Bool
    
    var body: some View {
        List {
            NavigationLink(destination: NavView2(presentNavView2: self.$presentNavView2), isActive: self.$presentNavView2, label: {
                Button(action: {
                    self.presentNavView2.toggle()
                }, label: {
                    Text("To NavView2")
                }) // Button
            }) // NavigationLink
            Button(action: {
                self.presentNavView1.toggle()
            }, label: {
                Text("Back")
            })
        } // List
        .navigationTitle("NavView1")
    } // View
}

NavView2

struct NavView2: View {
    @Binding var presentNavView2: Bool

    
    var body: some View {
        VStack {
            Text("NavView2")
            Button(action: {
                self.presentNavView2.toggle()
            }, label: {
                Text("Back")
            }) // Button
        } // VStack
        .navigationTitle("NavView2")
    }
}
swiftui
2021-11-23 20:52:10
1

Najlepšiu odpoveď

0

Môžete použiť DismissAction, pretože PresentationMode budú označené ako zavrhované. Snažil som sa kód a funguje to perfektne! Tu máš!

import SwiftUI

struct MContentView: View {
    @State private var presentNavView1 = false
    
    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: NavView1(), isActive: self.$presentNavView1, label: {
                    Button(action: {
                        self.presentNavView1.toggle()
                    }, label: {
                        Text("To NavView1")
                    })
                })
            }
            .navigationTitle("Home")
        }
    }
}

struct NavView1: View {
    @Environment(\.dismiss) private var dismissAction: DismissAction
    
    @State private var presentNavView2 = false
    
    var body: some View {
        List {
            NavigationLink(destination: NavView2(), isActive: self.$presentNavView2, label: {
                Button(action: {
                    self.presentNavView2.toggle()
                }, label: {
                    Text("To NavView2")
                })
            })
            Button(action: {
                self.dismissAction.callAsFunction()
            }, label: {
                Text("Back")
            })
        }
        .navigationTitle("NavView1")
    }
}

struct NavView2: View {
    @Environment(\.dismiss) private var dismissAction: DismissAction

    var body: some View {
        VStack {
            Text("NavView2")
            Button(action: {
                self.dismissAction.callAsFunction()
            }, label: {
                Text("Back")
            })
        }
        .navigationTitle("NavView2")
    }
}

struct MContentView_Previews: PreviewProvider {
    static var previews: some View {
        MContentView()
    }
}
2021-11-24 09:23:51

To vyzerá skvele, ale je k dispozícii len v iOS 15. Vďaka za to, aj keď.
jonthornham

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................