SwiftUI - 预览太多
SwiftUI - too many previews
如何在我的视图中只显示 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 为它们中的每一个生成预览...请参阅 以了解类似的问题。
如何在我的视图中只显示 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 为它们中的每一个生成预览...请参阅