将SwiftUI视图作为参数传递给函数时,如何避免将SwiftUI视图转换为AnyView?

时间:2020-11-03 00:33:58

标签: swift swiftui

由于UINavigationControllerNavigationView极其有限和/或有故障,因此我在SwiftUI应用程序的内部使用了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,这有点烦人和不干净。

是否有更好的方法可以做到这一点,所以我不必每次都进行投射?

1 个答案:

答案 0 :(得分:2)

通常,如果要将视图收集到某个数组中,则需要使用parameters = 'name text, id integer'来键入视图(对于SwiftUI,这是很少见的,除非您知道自己在做什么,否则可能不是这样) ),但是由于您要做的只是推送AnyView的实例(UIViewControllers继承的实例),因此您应该能够使用通用函数:

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