SwiftUI:检测 NavigationView 后退按钮按下

JAH*_*lia 25 ios swift swiftui

当我在此代码SwiftUI中时,我找不到一种方法来检测用户何时点击导航视图的默认后退按钮DetailView1

struct RootView: View {
    @State private var showDetails: Bool = false
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: DetailView1(), isActive: $showDetails) {
                    Text("show DetailView1")
                }
            }
            .navigationBarTitle("RootView")
        }
    }
}

struct DetailView1: View {
    @State private var showDetails: Bool = false
    var body: some View {
        NavigationLink(destination: DetailView2(), isActive: $showDetails) {
            Text("show DetailView2")
        }
        .navigationBarTitle("DetailView1")
    }
}

struct DetailView2: View {
    var body: some View {
        Text("")
            .navigationBarTitle("DetailView2")
    }
}

Run Code Online (Sandbox Code Playgroud)

使用.onDisappear并不能解决问题,因为当弹出视图或推送新视图时会调用它的闭包。

Saú*_*ril 22

快速的解决方案是创建一个自定义后退按钮,因为目前框架没有这种可能性。

struct DetailView : View {

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

    var body : some View {
        Text("Detail View")
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: Button(action : {
                self.mode.wrappedValue.dismiss()
            }){
                Image(systemName: "arrow.left")
            })
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用此解决方案,您可能还想确保在用户滑动返回(而不是点击“后退”按钮)时您的操作会运行。 (11认同)

mac*_*ael 12

一旦按下后退按钮,视图就会将 isPresented 设置为 false,因此您可以使用该值的观察者在按下后退按钮时触发代码。假设此视图出现在导航控制器内:

struct MyView: View {
    @Environment(\.isPresented) var isPresented

    var body: some View {
        Rectangle().onChange(of: isPresented) { newValue in
            if !newValue {
                print("detail view is dismissed")
            }
        }
    }
}
    
Run Code Online (Sandbox Code Playgroud)

  • 无论是将新视图推入堆栈,还是弹出当前视图,“isPresnted”都将变为 false,因此此答案仅在 DetailView 是导航堆栈中的最后一个视图时才有效。OP的问题明确提到,由于同样的问题,他们不能使用`.onDisappear`。 (7认同)
  • 仅适用于 &gt;= iOS 15 (4认同)