关闭模态视图时不调用onDisappear

时间:2020-02-29 17:58:47

标签: ios swiftui

我依靠SwiftUI的.onDisappear来执行一些逻辑,但是当用户使用滑动手势关闭模态呈现的视图时,不会调用它。再现

  • 以模态形式向视图显示“ ChildView 1”
  • 在此视图上,将“ ChildView 2”作为导航子项
  • 向下滑动以关闭模式视图。

未调用“ ChildView 2”的.onDisappear。

要复制的示例代码

import SwiftUI

struct ContentView: View {
    @State var isShowingModal
    var body: some View {
        NavigationView {
            Button(action: {
                self.isShowingModal.toggle()
            }) {
                Text("Show Modal")
            }
        }
        .sheet(isPresented: $isShowingModal) {
            NavigationView {
                ChildView(title: 1)
            }
        }
    }
}

struct ChildView: View {
    let title: Int
    var body: some View {

        NavigationLink(destination: ChildView(title: title + 1)) {
            Text("Show Child")
        }
        .navigationBarTitle("View \(title)")


        .onAppear {
            print("onAppear ChildView \(self.title)")
        }
        .onDisappear {
            print("onDisappear ChildView \(self.title)")
        }
    }
}

输出为:

onAppear ChildView 1
onAppear ChildView 2
onDisappear ChildView 1

enter image description here

2 个答案:

答案 0 :(得分:2)

如果您希望在取消实际模态时发生逻辑,您将要在这里调用,在此我打印出模态已取消:

struct ContentView: View {
    @State var isShowingModal = false
    var body: some View {
        NavigationView {
            Button(action: {
                self.isShowingModal.toggle()
            }) {
                Text("Show Modal")
            }
        }
        .sheet(isPresented: $isShowingModal) {
            NavigationView {
                ChildView(title: 1)
            }
            .onDisappear {
                print("Modal Dismissed")
            }
        }
    }
}

答案 1 :(得分:0)

struct ContentView: View {
    @State var isShowingModal = false
    var body: some View {
        NavigationView {
            Button(action: {
                self.isShowingModal.toggle()
            }) {
                Text("Show Modal")
            }
        }
        .sheet(isPresented: $isShowingModal) {
            NavigationView {
                ChildView(title: 1)
            }
        }
    }
}

在此代码中,您具有NavigationView,在显示工作表时,将另一个NavigationView推到那里。这是麻烦的根源

您不需要任何NavigationView即可显示模态。如果您希望从模态中呈现另一个模态,则可以使用

import SwiftUI

struct ContentView: View {
    var body: some View {
         ChildView(title: 1)
    }
}

struct ChildView: View {
    @State var isShowingModal = false
    let title: Int
    var body: some View {

        Button(action: {
                self.isShowingModal.toggle()
            }) {
                Text("Show Modal \(title)").font(.largeTitle)
            }
        .sheet(isPresented: $isShowingModal) {
            ChildView(title: self.title + 1)

        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

enter image description here

更新

来自苹果的

人机界面指南

模式是一种设计技术,它以一种临时模式来呈现内容,该模式与用户以前的当前上下文是分开的,并且需要采取明确的措施才能退出