如何从 SwiftUI 推送到现有的 UINavigationController 堆栈?

Ari*_*lSD 8 uinavigationcontroller swift swiftui swiftui-navigationlink swiftui-navigationview

我们正在推动SwiftUI嵌入在土地中的视图,UIHostingViewController如下UIKit所示:

首先制作UIViewController

    func hostingController() -> UIViewController {
    let swiftUIView = swiftUIView(viewModel: viewModel(data: [Data, Data, Data]))
    return UIHostingController(rootView: swiftUIView)
}
Run Code Online (Sandbox Code Playgroud)

然后将其压入UINavigationView堆栈:

[self.navigationController pushViewController:hostingViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

这让我们进入了SwiftUI环境。但是,如果我们的SwiftUI环境有自己的带有NavigationView和的导航堆栈NavigationLink,则原始navigationBar的后退按钮只能导航回原始呈现UIViewController

有没有办法将SwiftUI嵌入的视图推NavigationView送到现有UINavigationController堆栈上?

到目前为止,我们唯一的想法是UIHostingViewController为每个新SwiftUI屏幕创建一个新屏幕,并通过某种委托方法将其推送到堆栈上。

我们正在寻找的是这样的:

UINavigationStack: [UIViewController -> UIViewController -> SwiftUIView -> SwiftUIView]
Run Code Online (Sandbox Code Playgroud)

中的后退<箭头navigationBar将按预期运行。

如果我们可以进一步澄清,请告诉我们!

har*_*arp 5

我遇到了类似的问题 - 我将带有 NavigationView 的 SwiftUI 视图添加到 UIKit NavigationController 中,当在 SwiftUI 视图中继续导航时,这会导致两层导航栏:UIKit NavigationController -> MyListNavigationView(MyListView) -> DetailView。

将 SwiftUI 视图添加到 UIKit NavigationController:

let swiftUIView = MyListNavigationView(content: contentList)
let hostingViewController =  UIHostingController(rootView: swiftUIView)
self.navigationController?.pushViewController(hostingViewController, animated: true)
Run Code Online (Sandbox Code Playgroud)

我的简化 SwiftUI 视图(未验证简化后是否可以编译):

struct MyListNavigationView: View {
    @State var content: [String]
    var body: some View {
        NavigationView {  //replace with Group {
            MyListView(content: $content)
                .toolbar {
                    ToolbarItem(placement: .navigationBarTrailing) {
                        NavigationLink {
                            DetailView(data: "New Data")
                        } label: {
                            Image(systemName: "plus")
                        }
                    }
                }
        }
        .navigationViewStyle(.stack)
        .navigationTitle("My Title")
    }
}

struct MyListView: View {
    @Binding var content: [String]
    var body: some View {
        List(content, id: \.self) { data in
            NavigationLink(destination: DetailsView(data: data) {   
                MyRow(data: data)
            }
        }
    }
}

struct MyRow: View {
    let data: String
    var body: some View {
        Text(data)
    }
}

struct DetailView: View {
     let data: String
     var body: some View {
        Text(data)
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,通过该设置,我有 2 层导航栏 - 通过一个简单的更改,一切都对我有用:由于我只添加MyListNavigationView到 UIKit NavigationController,所以我不需要独立的 SwiftUI NavigationView,只需将其替换为Group- 以及所有导航我的 SwiftUI 视图中的 /toolbar 设置已被父 UIKit NavigationController 采用,并且只有一个导航栏。