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

时间:2020-09-24 12:19:20

标签: swift xcode swiftui uikit

我是Swift和Xcode的新手。我一直在关注Apple的SwiftUI教程,并没有太大的问题,直到我到达这里:与UIKit(https://developer.apple.com/tutorials/swiftui/interfacing-with-uikit)的连接

进入步骤5时,构建成功,但是没有预览。 我收到的错误是:

“ RemoteHumanReadableError:无法更新预览。

预览过程似乎崩溃了。

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

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

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

任何有关我做错事情的帮助,以及为什么做错了对您都有帮助:)

编辑:添加了代码


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)
    }
}

4 个答案:

答案 0 :(得分:10)

使用此page as inspiration,我可以使用以下代码在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)
    }
}

似乎您需要从Preview内部传递一个完全构建的UIHostingController数组,因此我创建了一个额外的init重载以用于预览模式。基于[Page]的{​​{1}}是为了使代码与教程中的下游步骤兼容。关于为什么它可以与init一起使用的原因,令人遗憾的是,我不知道(例如,如果将static let语句放在let内作为非静态previews,将无法生成预览。

答案 1 :(得分:3)

这对我有用。 添加了@State&$ currentPage以使预览以及在活动预览中更改图像的滑动终于可以使用!

您需要先完成与UIKit的接口第3节,因为您必须在PageViewController.swift中添加必要的行。在第3节-步骤6中将协调员指定为委托后,请保持固定钉住状态,以使其最终工作。


//  PageView.swift

import SwiftUI

struct PageView<Page: View>: View {
    @State var currentPage = 1
    
    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 {
        VStack {
            PageViewController(controllers: viewControllers, currentPage: $currentPage)
            Text("Current Page: \(currentPage)")
        }
    }
}

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


答案 2 :(得分:0)

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

答案 3 :(得分:0)

尝试注释掉 AppDelegate 中的 didFinishLaunchingWithOptions 方法,希望这能解决问题。您的应用程序可能会引用外部框架!!