如果Preview Content文件夹中有SwiftUI Previews的代码,为什么Archive会失败?

emeijp43  于 2023-05-27  发布在  Swift
关注(0)|答案(2)|浏览(176)

在我的SwiftUI应用程序中,我将一些示例模型对象放在Xcode的“Preview Content”文件夹中。我只在我的SwiftUI PreviewProvider中访问它们。我的理解是,此文件夹中的代码/资产仅用于在画布中预览。我的预览工作正常。我使用的是Xcode 11.6(11 E708)。
但是,当我转到Archive my app时,它失败了,因为它找不到这些示例模型对象。我的印象是,X1 m1n1x代码没有构建到Xcode 11的最终二进制文件中。请参阅this question,沿着Xcode 11发行说明中的内容:

已解决问题

围绕PreviewProvider类型的#if/#endif编译器条件已从SwiftUI模板中删除。存档时,PreviewProviders未从构建的产品中正确删除。(51539802)
(奇怪的是,我能够使用Release配置进行编译。只是Archive失败了。)
作为一种变通方法,我可以在PreviewProvider周围放置#if DEBUG/#endif Package 器,但发行说明中的上述引用表明不需要这样做。
我是否误解了“预览内容”文件夹的工作原理?

pgx2nnw8

pgx2nnw81#

编辑:没关系,这种方法“工作”,但预览代码仍然在最终存档中,所以它并没有真正帮助任何事情。
我把我所有的预览测试数据放在它自己的PreviewProvider中,这样我就可以在其他预览中访问它。存档仍然成功,测试数据将在最终存档中剥离。不需要#if DEBUG
示例(针对我自己的用例):

struct PreviewData: PreviewProvider {
    static var previews: some View {
        Text("This is test data for use in other previews.")
    }

    // Use enums for namespacing if desired
    enum Choices {
        static let deals = Choice(id: UUID().uuidString, text: "I want the best deals.", iconName: "bestDealsIcon")
        static let technology = Choice(id: UUID().uuidString, text: "I love technology!", iconName: "technologyIcon")
    }

然后我可以访问其他PreviewProvider中的PreviewData.Choices.deals

qyswt5oh

qyswt5oh2#

我遇到了一个非常类似的问题,只是我正在为现有的应用程序构建一个应用程序剪辑。我无法使用Xcode 12.5.1或13.0版本的发布方案或存档进行编译。
解决方案是将Preview Content目录包含在父应用程序目标的开发资产下,而不是应用程序剪辑目标本身。因此,我让它在所有场景中工作,包括SwiftUI预览,发布版本和存档父应用以供分发。

相关问题