Вопрос: Как сбросить холст предварительного просмотра Xcode? В частности, как стереть все основные данные на холсте, созданные в интерактивном предварительном просмотре холста?
Пример кода: Это код предварительного просмотра SwiftUI, который я использую для предварительного просмотра Canvas.
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)
}
}
С помощью этого кода Canvas показывает мне testItem, а также item.name объектов Core Data, созданных в Live Preview. Я хочу стереть данные Canvas, чтобы не видеть ранее созданные объекты.
Вещи, которые я пробовал: Xcode - Продукт> Папка чистой сборки Xcode - Редактор> Холст> Обновить холст Симулятор - Устройство> Стереть все содержимое и настройки ...
Последний работает, как и ожидалось, для Simulator. Я надеялся, что он может стереть и данные Canvas, но это не так.
-
Полный рабочий пример:
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.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)
}
}
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)
}
}
Также эта статья должна быть полезной donnywals.com/setting-up-a-core-data-store-for-unit-tests.
Иногда проще просто создать новый экземпляр вашего приложения в предварительном просмотре, а затем сослаться на контейнер. MyApp (). Persistentcontainer.viewContext
Спасибо nicksarno и Asperi. Я прочитаю больше о том, что вы мне сказали. Пока я не знаю, как использовать оба метода
Но если оставить в стороне эту проблему с Core Data, есть ли где-нибудь кнопка Reset для Canvas? :)





Просто не используйте производственный постоянный контейнер. Для предварительного просмотра и UT лучше использовать локально созданный контекст с постоянным хранилищем в памяти (NSInMemoryStoreType). См. Далее, как настроить стек данных кода (используя вместо этого
addPersistentStoreWithType:NSInMemoryStoreType) developer.apple.com/library/archive/documentation/Cocoa/…