【问题标题】:Supporting SwiftUI navigation in legacy projects在遗留项目中支持 SwiftUI 导航
【发布时间】:2020-01-18 07:50:17
【问题描述】:

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

现在我想开始使用 SwiftUI,所以我在项目的 General 中启用了选项,目标是 iOS 13,获取我的 SceneDelegate 和我的新键值对在 Info.plist 中。为了导航到 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")
    }
}

【问题讨论】:

  • 我的建议?如果您的项目是 Storyboard 项目,不要将您的根 VC 设为 UIHostingViewController 或将根视图设为 SwoftUI View。时期。由于您有一个故事板和一个 UINavigationController 已经在工作,只需导航(或推送)托管 VC 到堆栈并使用 ComposeNotifications 从那里导航。换句话说,去掉 ContentView 中的 NavigationView,将 NavigationLink 更改为 SwiftUI Button,并将其设置为告诉 UIKit 导航推送/弹出堆栈的操作。
  • 有没有办法让 SwiftUI 视图中的导航控制器推送或弹出堆栈?还是我必须将它作为初始化参数传递?
  • 首先,我没有否决你的问题——我想我明白你在问什么。如果是这样,这是(可能?)不可能的事情。 (但是?)但要考虑更深层次的东西——你想要的一切的复杂性。如果您要将旧版应用程序带入某种仅支持 iOS 13 的分支,为什么不从 SwiftUI 应用程序开始呢?为什么不将你的 UIKit 视图和 VC 移植到可表示的视图中呢?最后,如果您必须让您的 iOS 13 应用程序更像是 UIKit 而不是 SwiftUI,为什么不让 navigation 与一切,成为其中的一部分吗?续。
  • 我认为这应该回答你的问题:stackoverflow.com/questions/57965840/…
  • 对于你的最后一个问题,我想说看看过去。 Cocoa/Carbon、AppKit/UIKit,以及 2 天内,AppKit/UIKit/WatchKit/SwiftUI。毫无疑问 - 没有 - 总有一天这将是 SwiftUI。但是,当 Carbon 持续了 8 年(被 64 位淘汰)并且 AppKit 仍然存在时,而且,正如 Apple 每年多次自豪地指出的那样,UIKit 是一个拥有数百万个应用程序的价值十亿美元的产业......好吧,我不知道不知道你多大了,但你可能会在 UIKit 消失之前退休! (我说的只是软件,不是操作系统,不是硬件。)

标签: ios swiftui ios13 navigationlink


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 2023-02-02
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多