我们正在推动SwiftUI
嵌入UIHostingViewController
的UIKit
视图,就像这样:
首先制作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
环境与NavigationView
和NavigationLink
有自己的导航堆栈,那么原始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采用,只有一个导航栏。