Xcode 15 Beta 8:WidgetKit #Preview Macro 停止工作:

Xcode 15 Beta 8: WidgetKit #Preview Macro stopped working:

提问人:GarySabo 提问时间:9/4/2023 更新时间:10/3/2023 访问量:400

问:

在 Xcode 15 Beta 8 中使用 #Preview 宏有什么变化吗?此代码以前工作正常,但现在不再编译,因为== PREVIEW UPDATE ERROR: CompileDylibError: Failed to build WatchRecoveryWidget.swift Compiling failed: cannot convert value of type 'WatchRecoveryScoreTimeLineEntry' to closure result type 'any View'

  #Preview(as: WidgetFamily.accessoryRectangular) {
    WatchRecoveryScoreWidget()
} timeline: {
    WatchRecoveryScoreTimeLineEntry(date: Date(), recoveryScore: 75, subscriptionIsActive: true)
}
Xcode watchOS 小部件套件 xcode15 swift-macro

评论

3赞 Mark Bridges 9/5/2023
同样的问题在这里。
1赞 GarySabo 9/5/2023
我提交了反馈 #13110291
0赞 eschos24 9/30/2023
您提交的反馈有任何更新吗?我在 RC 上遇到了同样的问题,这太令人沮丧了!
1赞 eschos24 9/30/2023
我知道有一些关于 Xcode 发行说明的讨论提到这是一个已知问题:“在 watchOS 应用程序和 iOS 应用程序共享的小部件中预览文件时,预览可能会失败。 (108017929)” 但是我已经下载到了 beta 6,并且仍然遇到完全相同的问题,即它试图使用我的 TimelineProvider(或 TimelineEntry)作为 .您知道您上次在哪个测试版工作的地方使用吗?any View
0赞 GarySabo 9/30/2023
我在 RC Xcode 中仍然存在问题,我只能使用旧 API 预览小部件。我的小部件确实在后端使用了一些与 iOS 应用程序共享的代码。PreviewProvider

答:

4赞 eschos24 10/3/2023 #1

我能够通过在每个预览上方添加来解决这个问题。不知道为什么它显示的错误如此具有误导性,但希望在未来的 Xcode 15 更新中得到解决。@available(iOS 17.0, *)

因此,您的预览现在将如下所示:

@available(iOS 17.0, *)
#Preview(as: .accessoryRectangular) {
    WatchRecoveryScoreWidget()
} timeline: {
    WatchRecoveryScoreTimeLineEntry(date: .now, recoveryScore: 75, subscriptionIsActive: true)
}

评论

0赞 GarySabo 10/3/2023
好主意,但这对我不起作用,我仍然看到Compiling failed: cannot convert value of type 'WatchRecoveryScoreTimeLineEntry' to closure result type 'any View'
0赞 eschos24 10/3/2023
您只有一个预览宏吗?您是否在任何其他文件中没有它们?您必须将其放在每个预览宏上方。@available(iOS 17.0, *)
0赞 GarySabo 10/3/2023
整个应用程序中的每个预览宏还是只有 1 个目标?我在手表上有大约 10 个小部件,并将每个小部件的 @available(iOS 17.0, *) 放在上面,并且有同样的问题。我没有尝试我的 iPhone Widget 代码,但它是一个单独的目标,所以这应该无关紧要,对吧?
1赞 eschos24 10/3/2023
啊,如果它们在 watchOS 和 iOS 之间共享,那么无论如何预览都可能会中断。在 Xcode 15 的发行说明中,它提到了一个已知问题,即“在 watchOS 应用程序和 iOS 应用程序共享的小部件中预览文件时,预览可能会失败108017929。
0赞 GarySabo 10/3/2023
明白了,是的,我在 iOS 和 watchOS 之间共享了大量代码。