List や LazyVStack などの、
一つの要素の View の #Preview を
簡単に表示するというだけの件。
よくある List 的な View。
その一つの Item の View。
struct ItemView: View {
var item: Item
var body: some View {
HStack {
Spacer()
Text("\(item.i)")
Spacer()
Text("\(item.s)")
}
.font(.largeTitle)
.monospaced()
.background()
}
}
この一つの View だけを #Preview で簡単に表示したい。
🤔 #Preview 用の View
Container のセットはより上位の View でセットするのが定石。
🤔 使い方
一つ入れ子でクロージャ。
#Preview {
PreviewOneModelView { item in
ItemView(item: item)
}
.modelContainer(for: Item.self, inMemory: false)
}
🤔 参考
Apple 公式サンプルより簡易化して抜粋しました。
public struct ModelPreview<Model: PersistentModel, Content: View>: View {
var content: (Model) -> Content
public init(@ViewBuilder content: @escaping (Model) -> Content) {
self.content = content
}
public var body: some View {
ZStack {
PreviewContentView(content: content)
}
.backyardBirdsDataContainer(inMemory: true) // * inMemory
}
struct PreviewContentView: View {
var content: (Model) -> Content
@Query private var models: [Model]
@State private var waitedToShowIssue = false
var body: some View {
if let model = models.first { // * first
content(model)
} else {
ContentUnavailableView { // * could not get first item
Label {
Text(verbatim: "Could not load model for previews")
} icon: {
Image(systemName: "xmark")
}
}
.opacity(waitedToShowIssue ? 1 : 0)
.task {
Task {
try await Task.sleep(for: .seconds(1))
waitedToShowIssue = true
}
}
}
}
}
}
👉 sample-backyard-birds/BackyardBirdsData/General/ModelPreview.swift · apple/sample-backyard-birds