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



我们正在推动SwiftUI嵌入UIHostingViewControllerUIKit视图,就像这样:

首先制作UIViewController:

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

然后将其压入UINavigationView堆栈:

[self.navigationController pushViewController:hostingViewController animated:YES];

这让我们进入SwiftUI的环境。但是,如果我们的SwiftUI环境与NavigationViewNavigationLink有自己的导航堆栈,那么原始navigationBar的返回按钮只能导航到原始呈现的UIViewController

是否有办法将SwiftUI视图嵌入NavigationView到现有的UINavigationController堆栈?

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

我们要找的东西是这样的:

UINavigationStack: [UIViewController -> UIViewController -> SwiftUIView -> SwiftUIView]

navigationBar中后面的<箭头将按预期行为。

请让我们知道,如果我们可以进一步澄清!

我有一个类似的问题-我添加了一个带有NavigationView的SwiftUI视图到UIKit NavigationController,这会导致在SwiftUI视图中继续导航时出现两层导航栏:MyListNavigationView (MyListView)→DetailView .

添加SwiftUI视图到UIKit NavigationController:

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

我简化的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)
}
}

所以有了这样的设置,我有两层导航栏-并与一个简单的改变,这一切都为我工作:因为我只添加了MyListNavigationView到UIKit NavigationController,我不需要一个独立的SwiftUINavigationView,只是用Group代替它——所有的导航/工具栏设置从我的SwiftUI视图已经被父UIKit NavigationController采用,只有一个导航栏。

最新更新