Xcode 和 SwiftUI - 如何重置 Canvas?

mal*_*low 9 xcode canvas core-data ios swiftui

问题: 如何重置 Xcode 的预览画布?具体来说,如何删除在Canvas实时预览中创建的所有Canvas核心数据?

示例代码: 这是我用于 Canvas 预览的 SwiftUI 预览代码。

struct ItemView_Previews: PreviewProvider {
    static var previews: some View {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        //Test data
        let testItem = Item.init(context: context)
        testItem.name = "Abc"
        return ItemView(filter: false)
            .environment(\.managedObjectContext, context)
    }
}
Run Code Online (Sandbox Code Playgroud)

通过此代码,Canvas 向我显示了 testItem,而且还显示了在实时预览中创建的 Core Data 对象的 item.name。我想删除画布数据以看不到以前创建的对象。

我尝试过的事情: Xcode - 产品 > 清理构建文件夹 Xcode - 编辑器 > 画布 > 刷新画布模拟器 - 设备 > 删除所有内容和设置...

最后一项按模拟器的预期工作。我希望它也能删除 Canvas 数据,但事实并非如此。

--

完整的工作示例:

内容视图.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.name = "Test"
                        
                        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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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 {
        VStack {
            ForEach(items, id: \.self) {item in
                Text("\(item.name ?? "test123")")
            }
        }
    }
}

struct ItemView_Previews: PreviewProvider {
    static var previews: some View {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        //Test data
        let testItem = Item.init(context: context)
        testItem.name = "Abc"
        return ItemView(filter: false)
            .environment(\.managedObjectContext, context)
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 19

尝试这个,

  • 打开终端
  • 进入你的项目目录
  • 运行这个命令:xcrun simctl --set previews delete all

这将清除您的模拟器预览缓存数据。