是否有与 viewWillDisappear(_:) 等效的 SwiftUI 或检测视图何时将被删除?

FRI*_*DAY 22 ios navigationview swiftui

在SwiftUI,我试图找到一种方法来检测一个视图即将被删除使用默认只有当navigationBackButton。然后执行一些操作。

使用onDisappear(perform:)viewDidDisappear(_:),动作在另一个视图出现后执行。

或者,我想通过检测何时按下默认值 可以解决上述问题navigationBarBackButton。但我发现没有办法检测到这一点。

是否有任何解决方案可以在另一个视图出现之前执行某些操作?

(我已经知道可以通过创建自定义导航后退按钮来关闭视图来做到这一点)

Asp*_*eri 37

这是对我有用的方法,它不是纯 SwiftUI,但我认为值得发布

用法:

   SomeView()
   .onDisappear {
        print("x Default disappear")
    }
   .onWillDisappear { // << order does NOT matter
        print(">>> going to disappear")
    }
Run Code Online (Sandbox Code Playgroud)

代码:

struct WillDisappearHandler: UIViewControllerRepresentable {
    func makeCoordinator() -> WillDisappearHandler.Coordinator {
        Coordinator(onWillDisappear: onWillDisappear)
    }

    let onWillDisappear: () -> Void

    func makeUIViewController(context: UIViewControllerRepresentableContext<WillDisappearHandler>) -> UIViewController {
        context.coordinator
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<WillDisappearHandler>) {
    }

    typealias UIViewControllerType = UIViewController

    class Coordinator: UIViewController {
        let onWillDisappear: () -> Void

        init(onWillDisappear: @escaping () -> Void) {
            self.onWillDisappear = onWillDisappear
            super.init(nibName: nil, bundle: nil)
        }

        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }

        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            onWillDisappear()
        }
    }
}

struct WillDisappearModifier: ViewModifier {
    let callback: () -> Void

    func body(content: Content) -> some View {
        content
            .background(WillDisappearHandler(onWillDisappear: callback))
    }
}

extension View {
    func onWillDisappear(_ perform: @escaping () -> Void) -> some View {
        self.modifier(WillDisappearModifier(callback: perform))
    }
}
Run Code Online (Sandbox Code Playgroud)