0

我正在尝试显示卡片视图的多个预览(Apple 的 SwiftUI 教程)。我设法使用Group结构手动完成。

struct CardView_Previews: PreviewProvider {
    
    static var previews: some View {
        Group {
            CardView(scrum: DailyScrum.data[0])
                .background(DailyScrum.data[0].color)
            CardView(scrum: DailyScrum.data[1])
                .background(DailyScrum.data[1].color)
        }.previewLayout(.fixed(width: 400, height: 60))
    }
}

我想使用 ForEach 根据测试数据自动显示四个单元格,但是以下内容无法构建,并且编译器无法为表达式生成诊断。

struct CardView_Previews: PreviewProvider {
    
    static var previews: some View {
        Group {
            ForEach(DailyScrum.data) { scrum in
                CardView(scrum: scrum)
                    .background(scrum.color)
            }
        }.previewLayout(.fixed(width: 400, height: 60))   
    }   
}

有没有办法在不显式创建每个预览的情况下构建预览?

4

2 回答 2

0

您不能将 aPreviewProvider视为正在运行的应用程序的一部分。仅当您在画布上为该特定视图使用预览时才使用它。因此,您需要提供给视图的任何数据都必须从视图本身或通过其PreviewProvider本身提供。

从您的代码中,您的模型似乎包含一个用于填充单元格DailyScrum的数组。data因此,如果你想在 中声明它,PreviewProvider你可以像这样声明它:

struct CardView_Previews: PreviewProvider {
    
    let dailyScrum = DailyScrum(
        // Initialize your data here
    )

    static var previews: some View {
        Group {
            ForEach(dailyScrum.data) { scrum in
                CardView(scrum: scrum)
                    .background(scrum.color)
            }
        }.previewLayout(.fixed(width: 400, height: 60))   
    }   
}

如果这是您可能在其他视图中使用的模型数据,那么您可能希望遵循 DRY 而不是通过在所有PreviewProviders. 在那种情况下,我会static let在模型本身中制作你的数据,如下所示:

...
static let previewData = DailyScrum(
        // Initialize your data here
    )
...

然后PreviewProvider像这样使用它:

struct CardView_Previews: PreviewProvider {

    static var previews: some View {
        Group {
            ForEach(DailyScrum.previewData) { scrum in
                CardView(scrum: scrum)
                    .background(scrum.color)
            }
        }.previewLayout(.fixed(width: 400, height: 60))   
    }   
}

其编写方式假定DailScrum符合Identifiable. 如果没有,它应该,否则您将不得不编写您的ForEachasForEach(DailyScrum.previewData, id: \.self)或模型的其他部分,您可以使用它们来识别各个元素。

于 2021-09-13T12:53:20.447 回答
0

id通过简单地将参数添加到ForEach初始化程序,我找到了我正在寻找的解决方法。它可以防止必须添加Identifiable对 type 的一致性:

struct CardView_Previews: PreviewProvider {
    
    static var previews: some View {
        Group {
            ForEach(DailyScrum.data, id: \.title) { scrum in
                CardView(scrum: scrum)
                    .background(scrum.color)
            }
        }.previewLayout(.fixed(width: 400, height: 60))
        
    }
    
}
于 2021-09-15T12:38:57.333 回答