支持遗留项目中的 SwiftUI 导航

Supporting SwiftUI navigation in legacy projects

我想知道是否有任何方法可以在遗留项目中开始使用 SwiftUI 并且仍然能够来回导航 SwiftUI场景。也就是说,假设我只想为我去年一直在从事的项目支持最后一个 iOS 13。一切都建立在 UIKit 之上,导航以通常的方式呈现或推送视图控制器。

现在我想开始使用 SwiftUI 所以我在项目的常规中启用该选项,目标 iOS 13 ,在 Info.plist 中获取我的 SceneDelegate 和我的新键值对。为了导航到 Swift UI 场景,我可以推送一个 UIHostingViewController rootView 将是我新设计的 SwiftUI 视图。但是我如何使用 NavigationLink 推送旧的 UIKit 视图控制器?

class ViewController: UIViewController {

    @IBAction func userDidTapGo(_ sender: Any) {
        let contentView = ContentView()
        navigationController?.pushViewController(UIHostingController(rootView: contentView), animated: true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        title = "UIKit"
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: /* what should be here?? */) {
                Text("Go to UIKit")
            }

        }.navigationBarTitle("Swift UI")
    }
}

您需要将旧视图控制器包装在 UIViewControllerRepresentable 包装器中。 Apple 有一个很好的教程:Interfacing with UIKit.

效果很好,让您可以重用旧代码,而不是从头开始重写所有内容。