如何从SwiftUI向现有的UINavigationController堆栈中推送视图?

8
我们正在将一个嵌入在 UIHostingViewController 中的 SwiftUI 视图推向 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。
是否有一种方法可以将嵌入在NavigationView中的SwiftUI视图推送到现有的UINavigationController堆栈上?
到目前为止,我们所想到的唯一想法是为每个新的SwiftUI屏幕创建一个新的UIHostingViewController,并通过某种委托方法将其推送到堆栈上。
我们正在寻找像这样的东西:
UINavigationStack: [UIViewController -> UIViewController -> SwiftUIView -> SwiftUIView]

navigationBar中的返回<箭头将按预期行为。

如果需要进一步澄清,请告诉我们!

1个回答

4

我曾遇到过类似的问题——我将一个带有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)

我的简化后的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中,我不需要独立的SwiftUI NavigationView,而只是替换它与一个 Group - 所有从我的SwiftUI视图中继承的导航/工具栏设置都被父亲UIKit NavigationController采用,只有一个导航栏。


很好,这帮了我。 - Joao Guilherme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接