检查是否有导航,并从 SwiftUI 视图呈现和推送

Check if there is navigation, and present and push from a SwiftUI view

我正在试验 SwiftUI。我已经有一个基于 UIKit 的应用程序在运行,我想集成一个 SwiftUI 视图。我通过使用 UIHostingController 来显示这个 SwiftUI 视图。

在这个 SwiftUI 中,我拦截了一个按钮操作。在这个动作中,我想:

  1. 检查是否有导航控制器(它在 UIKit 上曾经是 self.navigationController)
  2. 能够从此 SwiftUI 视图呈现或推送(通过 self.navigationController)一个新的 UIKit 视图控制器。

我找不到任何方法在 SwiftUI 上实现这三件事中的任何一件

您可以通过多种方式做到这一点:委托、闭包,甚至与联合发布者合作。我认为最简单的入门方法是使用动作关闭。它可能看起来像这样:

struct SwiftUIView: View {
    let action: () -> Void
    
    var body: some View {
        Button("press me", action: action)
    }
}

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let swiftUIView = SwiftUIView(action: handleButtonPress)
        
        let hostingController = UIHostingController(rootView: swiftUIView)
        addChild(hostingController)
        
        hostingController.view.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(hostingController.view)
 
        NSLayoutConstraint.activate([
            hostingController.view.topAnchor.constraint(equalTo: view.topAnchor),
            hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])
    }
    
    func handleButtonPress() {
        print("TODO: Insert navigation controller logic here")
    }
}