Sichtbare und unsichtbare Views

Soll beim erscheinen oder ausblenden eines Views in SwiftUI eine Aktion ausgelöst werden, so kann dies mit den Eventactions .onAppear() oder .onDisappear() geschehen. Dies funktioniert so gut, daß man bei einer Navigation leicht vergißt, daß man sich auch vorwärts zu einem noch folgenden View bewegen könnte. Beide Events werden also gefeuert, wenn ein View erscheint, bzw. ausgeblendet wird. Die Events sind also vielmehr auf den einzelnen View bezogen und nicht auf einen Navigationstree bezogen.

Eine Lösung

In manchen Fällen ist es aber notwendig, daß eine Aktion finalisiert wird, wenn man zum vorherigen View zurückkehrt. Dies läßt sich erreichen, indem man die vorgegebene Navigation abschaltet und den Zurück-Button selbst anlegt:

@Environment(\.presentationMode) var mode: Binding<PresentationMode>
...

.navigationBarBackButtonHidden(true)
.navigationBarItems(leading: Button(action : {
    self.mode.wrappedValue.dismiss()
    self.MyFunction()
}){
    Image(systemName: "arrow.left")
})

Der Nachteil an dieser Lösung ist jedoch, daß man eine Funktion ausschalten muß, die bereits funktioniert und lokalisiert ist.

Eine bessere Lösung

Wenn man die Environment-Variable 'presentationMode' setzt, so wird diese auch bedient, wenn man das navigationBarItem nicht übersteuert. So bietet sich zumindest ab IOS 14 folgende Möglichkeit an:

struct SecondView: View {
    
    @Environment(\.presentationMode) var mode: Binding<PresentationMode>

    private var aDA: ()->Void

    init(afterDismissAction: @escaping ()->Void) {
        self.aDA = afterDismissAction
    }


    var body: some View {
        VStack() {
        /*  STUFF  */
        Text("Hello")
        }
        .onChange(of: self.mode.wrappedValue.isPresented) { value in
            if value == false {
                print("Leaving this View backward")
                self.aDA() // <--- Do the stuff onGoBackward.
            }
        }
    }
}
         
        

Mit der Nutzung des '.presentationMode' und dem onChange-Event, wird eine Veränderung am Design unnötig.