SwiftUI 预览 - 意外数据
SwiftUI Previews - unexpected data
我想了解如何在 SwiftUI Canvas 预览版中使用示例数据。我进行了一些搜索,但没有找到问题的答案。
问题:
为什么我的 ItemView.swift 视图预览显示了我提供的示例数据 + 在实时预览中创建的核心数据模型的混合?
预览代码示例
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)
}
}
预期行为:
我期待看到 UI 带有测试数据的预览。所以换句话说,我期待在预览中看到“Abc”。
实际行为
但我看到的是一个混合项目列表:“Abc”重复了几次。 “测试”重复了几次(因为它是在实时预览中使用加号按钮创建的核心数据对象的 item.name 属性)。
这是为什么?当我专门提供了测试值 (testItem.name = "Abc") 时,为什么我会看到核心数据对象?
--
完整示例
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)
}
}
Why Preview of my ItemView.swift view shows a mixture of example data I have provided + Core Data models created in Live Preview?
下行启动持久数据的上下文,因此可以获取所有存储的核心数据对象
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
下面的行在上面创建的上下文中创建了一个新对象,所以它在上下文中(虽然要存储)并且可以与其他存储的一起获取。
let testItem = Item.init(context: context)
因此从此上下文中获取对象...
return ItemView(filter: false)
.environment(\.managedObjectContext, context)
...使所有 - 存储和创建 - 在预览中可用。
我想了解如何在 SwiftUI Canvas 预览版中使用示例数据。我进行了一些搜索,但没有找到问题的答案。
问题:
为什么我的 ItemView.swift 视图预览显示了我提供的示例数据 + 在实时预览中创建的核心数据模型的混合?
预览代码示例
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)
}
}
预期行为: 我期待看到 UI 带有测试数据的预览。所以换句话说,我期待在预览中看到“Abc”。
实际行为 但我看到的是一个混合项目列表:“Abc”重复了几次。 “测试”重复了几次(因为它是在实时预览中使用加号按钮创建的核心数据对象的 item.name 属性)。
这是为什么?当我专门提供了测试值 (testItem.name = "Abc") 时,为什么我会看到核心数据对象?
--
完整示例
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)
}
}
Why Preview of my ItemView.swift view shows a mixture of example data I have provided + Core Data models created in Live Preview?
下行启动持久数据的上下文,因此可以获取所有存储的核心数据对象
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
下面的行在上面创建的上下文中创建了一个新对象,所以它在上下文中(虽然要存储)并且可以与其他存储的一起获取。
let testItem = Item.init(context: context)
因此从此上下文中获取对象...
return ItemView(filter: false)
.environment(\.managedObjectContext, context)
...使所有 - 存储和创建 - 在预览中可用。