【问题标题】:Cannot convert value of type 'UIHostingController<AnyView>' to closure result type 'UIHostingController<Page>'无法将类型“UIHostingController<AnyView>”的值转换为关闭结果类型“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'

任何提示如何解决它?

【问题讨论】:

    标签: swiftui


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,@Asperi,第一个解决方案不起作用,因为我想在 PageControl 中的各个视图之间有填充,因此滚动将显示页面之间的分隔符。然而,第二个 - 作品。我现在真的很困惑,因为我确定我尝试过但没有成功,还有另一个编译消息,可能是 XCode 重新启动有帮助,或者其他什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2021-03-08
    • 2022-06-14
    相关资源
    最近更新 更多