A livello di programmazione di Presentazione e di revoca Vista SwiftUI

0

Domanda

Sto lavorando su un progetto che sta tentando di presente e di respingere il punto di vista in un NavigationView utilizzando lo stato e vincolante. Il motivo per cui sto facendo questo è che c'è un bug in @Ambiente(.presentationMode) var presentaionMode: Associazione modello. Questo sta causando un comportamento strano. È discusso in questo post qui.

L'esempio qui di seguito è tre viste che sono progressivamente caricato sulla vista. I primi due ContentView per NavView1 presente e chiudere perfettamente. Tuttavia, una volta che NavView2 è caricato, il pulsante che viene utilizzato per attivare o disattivare lo stato di presentNavView2 finisce con l'aggiunta di un altro NavView2 vista sullo stack e non respingere come previsto. Qualsiasi pensiero, perché questo sarebbe?

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

Migliore risposta

0

È possibile utilizzare DismissAction, perché PresentationMode sarà obsoleto. Ho provato il codice e funziona perfettamente! Qui si va!

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

Questo sembra grande, ma è disponibile solo per iOS 15. Grazie per questo però.
jonthornham

In altre lingue

Questa pagina è in altre lingue

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