SwiftUI - 太多预览

问题描述

如何只为我的视图显示 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 以了解类似问题。