无法将类型“UIHostingController<AnyView>”的值转换为关闭结果类型“UIHostingController<Page>”

Posted

技术标签:

【中文标题】无法将类型“UIHostingController<AnyView>”的值转换为关闭结果类型“UIHostingController<Page>”【英文标题】:Cannot convert value of type 'UIHostingController<AnyView>' to closure result type 'UIHostingController<Page>' 【发布时间】:2020-06-09 20:45:22 【问题描述】:

我正在根据Interacing with UIKit 教程使用 SwiftUI 实现 PageView。

而且,特别是有这样的代码:

struct PageView<Page: View>: View 
  var viewControllers: [UIHostingController<Page>]
  @State var currentPage = 0

  init(_ views: [Page]) 
      self.viewControllers = views.map  UIHostingController(rootView: $0) 
  

  var body: some View 
    PageViewController(controllers: viewControllers, currentPage: $currentPage)
  
  

可以以简单的方式调用视图:

PageView([FirstView(), SecondView()])

我想在页面视图周围做漂亮的填充,所以我可以通过以下方式调用这个视图:

PageView([AnyView(FirstView().padding()), AnyView(SecondView().padding()])

一切都很好,但我每次都必须重复 .padding() 并在调用方方法中包装 AnyView。但是,当我尝试将此代码移动到 init 方法时,我被困在错误中,无法绕过:

  init(_ views: [Page]) 
      self.viewControllers = views.map  UIHostingController(rootView: AnyView($0.padding())) 
  

报告为无法将'UIHostingController'类型的值转换为闭包结果类型'UIHostingController'

任何提示如何解决它?

【问题讨论】:

【参考方案1】:

可能最简单的方法是添加填充

  var body: some View 
    PageViewController(controllers: viewControllers, currentPage: $currentPage)
        .padding()     // << here !!
  

但如果您想在init 中创建那些AnyViews,则将成员声明更改为

  var viewControllers: [UIHostingController<AnyView>]    // << here !!

【讨论】:

谢谢,@Asperi,第一个解决方案不起作用,因为我想在 PageControl 中的各个视图之间有填充,因此滚动将显示页面之间的分隔符。然而,第二个 - 作品。我现在真的很困惑,因为我确定我尝试过但没有成功,还有另一个编译消息,可能是 XCode 重新启动有帮助,或者其他什么。

以上是关于无法将类型“UIHostingController<AnyView>”的值转换为关闭结果类型“UIHostingController<Page>”的主要内容,如果未能解决你的问题,请参考以下文章

SnapKit snp 无法分配给 UIHostingController

在构建 iOS 应用程序时获取在范围错误中找不到类型“UIHostingController”

将变量从 UIHostingController 传递到 SWIFTUI 视图

嵌入在 UIViewController 中的 UIHostingController - 如何从外部更新 @State?

为啥 SwiftUI UIHostingController 有额外的间距?

为啥在 SwiftUI Lifecycle 中将 rootViewController 设置为 UIHostingController 时会出错?