我是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)
}
}
答案 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 方法,希望这能解决问题。您的应用程序可能会引用外部框架!!