Apple 开发者 SwiftUI 教程的预览问题 - 框架集成接口与 UIKit

Jos*_*lia 11 xcode uikit swift swiftui

我对 Swift 和 Xcode 还很陌生。我一直在关注 Apple 的 SwiftUI 教程,并没有遇到太多问题,直到我来到这里:与 UIKit 交互(https://developer.apple.com/tutorials/swiftui/interface-with-uikit

当我到达第 5 步时,构建成功但没有预览。我收到的错误是:

“ RemoteHumanReadableError:无法更新预览。

预览过程似乎已崩溃。

向代理发送“渲染”消息时遇到错误。

==================================

| RemoteHumanReadableError: 操作无法完成。(BSServiceConnectionErrorDomain 错误 3。) |
| BSServiceConnectionErrorDomain (3): | ==BSErrorCodeDescription:操作失败”

对我做错了什么以及为什么错的任何帮助都会有很大帮助:)

编辑:添加了代码


import SwiftUI

struct PageView<Page: View>: View {
    var viewControllers: [UIHostingController<Page>]

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

    var body: some View {
        PageViewController(controllers: viewControllers)
    }
}

struct PageView_Previews: PreviewProvider {
    static var previews: some View {
        PageView(features.map { FeatureCard(landmark: $0) })
            .aspectRatio(3/2, contentMode: .fit)
    }
}

Run Code Online (Sandbox Code Playgroud)

小智 10

使用此页面作为灵感,我能够使用以下代码在 XCode 12 中完成这项工作:

import SwiftUI

struct PageView<Page: View>: View {
    var viewControllers: [UIHostingController<Page>]

    init(viewControllers: [UIHostingController<Page>]) {
        self.viewControllers = viewControllers
    }
    
    init(_ views: [Page]) {
        self.viewControllers = views.map { UIHostingController(rootView: $0) }
    }
    
    var body: some View {
        PageViewController(controllers: viewControllers)
    }
}

struct PageView_Previews: PreviewProvider {
    // the static in the following line is critical to it working...
    static let controllers = features.map { UIHostingController(rootView: FeatureCard(landmark: $0)) }
    
    static var previews: some View {
        PageView(viewControllers: controllers).aspectRatio(3/2, contentMode: .fit)
    }
}
Run Code Online (Sandbox Code Playgroud)

看来您需要UIHostingController从预览中传递一个完全构造的数组,因此我创建了一个额外的init重载以用于预览模式。该[Page]init是保持代码与本教程中的下游步骤兼容。至于为什么它适用于static let,可悲的是,我不知道(即,如果您将let语句放在里面previews作为非静态let,它将无法生成预览。


小智 0

我也有这个问题。在模拟器上运行就可以了。