问题描述
如何只为我的视图显示 1 个预览?现在我有一个视图的问题:ItemView.swift
在我运行 ContentView.swift 的实时预览并添加几个核心数据对象后,我的 ItemView.swift 显示所有对象和测试数据的预览。有很多对象,有很多预览,这会大大降低 Xcode 的速度。
我在代码中标记了 2 个可能导致问题的地方。我认为它是 ForEach 或 ItemView_Previews 结构。我试图修复它,但我不能。
我正在使用核心数据。并且有 1 个实体:项目,有 1 个属性:日期。但我认为这不是核心数据问题。
ContentView.swift
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedobjectContext) var managedobjectContext
@State var paidFilter :Bool? = nil
var body: some View {
NavigationView {
List {
ItemView(filter: paidFilter)
}
.listStyle(PlainListStyle())
.navigationTitle(Text("Items"))
.navigationBarItems(
trailing:
Button(action: {
let item = Item(context: self.managedobjectContext)
item.date = Date()
do {
try self.managedobjectContext.save()
}catch{
print(error)
}
}) {
Image(systemName: "plus.circle.fill")
.font(.title)
}
)
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
return ContentView()
.environment(\.managedobjectContext,context)
}
}
ItemView.swift
import SwiftUI
struct ItemView: View {
@Environment(\.managedobjectContext) var managedobjectContext
var fetchRequest: FetchRequest<Item>
var items: FetchedResults<Item> { fetchRequest.wrappedValue }
init(filter: Bool?) {
fetchRequest = FetchRequest<Item>(entity: Item.entity(),sortDescriptors: [])
}
var body: some View {
// I think problem is here
ForEach(items,id: \.self) {item in
Text("\(item.date ?? Date())")
}
}
}
struct ItemView_Previews: PreviewProvider {
static var previews: some View {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
//Or problem is here - Test data
let testItem = Item.init(context: context)
testItem.date = Date()
return ItemView(filter: false)
.environment(\.managedobjectContext,context)
}
}
解决方法
替换
var body: some View {
// I think problem is here
ForEach(items,id: \.self) {item in
Text("\(item.date ?? Date())")
}
}
与
var body: some View {
/// add VStack here!
VStack {
ForEach(items,id: \.self) {item in
Text("\(item.date ?? Date())")
}
}
}
如果没有 VStack 或其他一些容器,您的主体将包含多个视图。这使得 Xcode 为它们中的每一个生成预览...请参阅 here 以了解类似问题。