【问题标题】:Intercept SwiftUI NavigationBar Back Button Press拦截 SwiftUI NavigationBar 后退按钮按下
【发布时间】:2020-06-11 02:02:32
【问题描述】:

当在 swiftui 闭包中按下 NavigationBar 后退按钮时,有没有办法拦截 UIControl 事件(或任何事件)?或者当使用滑动手势时?

我正在尝试深入研究 UIViewControllerRepresentable 以了解如何绑定到 NavigationController(即 UINavigationControllerDelegate)中的委托方法,并通过 UIKit 组件中的逻辑将这些方法转换为生成“didNavigateToPrevious”信号,由通过堆栈的任何一种预期导航形式(即切换标签),例如点击后退按钮或滑动手势。

我还尝试在子类 UIHostingController 上覆盖 didMove(toParent:),到目前为止,它根本没有被调用。

然后巧妙地提供一个ViewModifier,它会附加一个闭包,以便在调用委托方法时调用。

我正在考虑类似的事情

NotifyingNavigationView {
   Text("Hello")
}.didNavigateBackward {
    // access environmentObject
}

【问题讨论】:

    标签: swiftui


    【解决方案1】:
    import SwiftUI
    
    struct DetailView: View {
    
        @Environment(\.presentationMode) var presentationMode: Binding
    
        var body: some View {
            NavigationView {
                VStack {
                    Text("Detail View")
                }
            }
            .onAppear(){
                print("Initial value: \(self.presentationMode.wrappedValue.isPresented)")
    
            }
            .onDisappear() {
                if(self.presentationMode.wrappedValue.isPresented == false) {
                    print("You click the back button")
                }
    
            }
        }
    }
    
    
    
    struct ContentView: View {
        var body: some View {
            NavigationView {
                VStack {
                    NavigationLink(destination: DetailView())
                    { Text("Go to view 2") }
                }
                .navigationBarTitle("Home")
    
            }
        }
    }
    

    【讨论】:

    • 我试图弄清楚当按下“后退”栏按钮项时如何在 SwiftUI 中通过 UINavigationController 在幕后“收到通知”。
    • 上面就是这样做的,当您单击返回时,它会打印一条消息,您可以将打印替换为您想要的任何功能@elight
    • 对我来说,这表明当新视图也被推入堆栈时会打印消息。是这样吗?我会测试它,除非你已经...
    • 我已经测试过了。在这种特殊情况下,因为您的示例非常简单,所以当您从第二个视图(我称之为视图 2)转换到任何视图时,我都会打印出来。它并没有真正绑定到“返回”按钮。 @elight
    • 哦,我明白了。好吧,听起来不是很刺耳,但这就是为什么我在这个问题上很具体,甚至还概述了 API 的外观。我会把我找到的东西发回来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多