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
将按预期运行。
如果我们可以进一步澄清,请告诉我们!
我遇到了类似的问题 - 我将带有 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 采用,并且只有一个导航栏。