首页 > 解决方案 > 将 SwiftUI 视图作为参数传递给函数时,如何避免将它们转换为 AnyView?

问题描述

我在后台使用UINavigationController我的 SwiftUI 应用程序,因为它非常有限和/或有NavigationView问题。NavigationLink我有一个调用的函数pushView(..)需要接收 SwiftUI 视图,将其包装,UIHostingController然后将其推送到导航堆栈的顶部:

func pushView(view: AnyView, animated: Bool = true) {
    let hostingView = UIHostingController(rootView: view)
    navigationController.pushViewController(hostingView, animated: animated)
}

现在,我的大多数电话看起来像...pushView(AnyView(MyView()),我必须将每一个视图都投射到AnyView这有点烦人和不干净。

有没有更好的方法来做到这一点,所以我不必每次都投射?

标签: swiftswiftui

解决方案


一般来说,AnyView如果你想将视图收集到某个数组中,你需要一个类型擦除视图(对于 SwiftUI 来说很少见,除非你知道自己在做什么,否则这可能不是要走的路),但既然所有你正在做的是推送UIViewControllersUIHostingController继承自)的实例,你应该能够使用通用函数:

func pushView<V: View>(view: V, animated: Bool = true) {
    let hostingView = UIHostingController(rootView: view)
    navigationController.pushViewController(hostingView, animated: animated)
}
pushView(view: MyView())

推荐阅读