TabView 上的元素删除后不消失
Element on TabView does not disappear after being deleted
我有这个 class:
class PageViewModel:ObservableObject {
@Published var cars = [Car]()
func delete(_ car:Car) {
cars = cars.filter { [=10=] != car }
}
}
然后我将这个 class 传递给一个名为 PageView
的视图,就像这样
@ObservedObject private var pageViewModel = PageViewModel()
var body: some View {
PageView(pageViewModel)
这是PageView
:
struct PageView: View {
@ObservedObject private var pageViewModel:PageViewModel
init(_ pageViewModel:PageViewModel) {
self.pageViewModel = pageViewModel
}
var body: some View {
TabView() {
ForEach(pageViewModel.cars) { car in
TopPanel(car, pageViewModel)
.frame(maxWidth: .infinity)
.padding([.leading, .trailing], 10)
.padding(.bottom,60)
}
}
.frame(height: 220)
.tabViewStyle(PageTabViewStyle())
.indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
}
}
注意:Car
是一个NSManagedObject
,所以默认是@ObservableObject
。在这里
汽车+CoreDataClass.swift
import Foundation
import CoreData
@objc(Car)
public class Car: NSManagedObject {
}
汽车+CoreDataProperties
extension Car : Encodable {
@nonobjc public dynamic class func fetchRequest() -> NSFetchRequest<Car> {
return NSFetchRequest<Car>(entityName: "Car")
}
@NSManaged public var model: String?
@NSManaged public var brand: String?
这是 TopPanel
问题的根源。
struct TopPanel: View {
@ObservedObject private var car:Car
@ObservedObject private var pageViewModel:PageViewModel
init(_ car:Car,
_ pageViewModel:PageViewModel?) {
self.car = car
self.pageViewModel = model
}
var body: some View {
Button(action: {
pageViewModel.delete(car)
}, label: {
Text("delete me")
})
请记住,TabView
显示的是 TopPanel
的页面,而此 TopPanel
有一个按钮,允许用户从 TabView
中删除自己。
问题是,当我在给定元素上按删除键时,它继续显示在 TabView
上,但 TabView
上的一个点被删除了。如果在那之后我尝试删除第二个,我会收到此消息:
*** Assertion failure in -[_TtC7SwiftUIP33_8825076C2763A50452A210CBE1FA4AF020PagingCollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:animator:collectionViewAnimator:], UICollectionView.m:6982
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete and reload the same index path (<NSIndexPath: 0xacce8bbd6a5ce2d8> {length = 2, path = 0 - 1})'
我该如何解决?
难以置信,我发现了如何解决这个问题,完全是偶然的。
只需添加
.id(pageViewModel.cars.count)
到 TabView。这将强制它在删除项目时更新。
我有这个 class:
class PageViewModel:ObservableObject {
@Published var cars = [Car]()
func delete(_ car:Car) {
cars = cars.filter { [=10=] != car }
}
}
然后我将这个 class 传递给一个名为 PageView
的视图,就像这样
@ObservedObject private var pageViewModel = PageViewModel()
var body: some View {
PageView(pageViewModel)
这是PageView
:
struct PageView: View {
@ObservedObject private var pageViewModel:PageViewModel
init(_ pageViewModel:PageViewModel) {
self.pageViewModel = pageViewModel
}
var body: some View {
TabView() {
ForEach(pageViewModel.cars) { car in
TopPanel(car, pageViewModel)
.frame(maxWidth: .infinity)
.padding([.leading, .trailing], 10)
.padding(.bottom,60)
}
}
.frame(height: 220)
.tabViewStyle(PageTabViewStyle())
.indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
}
}
注意:Car
是一个NSManagedObject
,所以默认是@ObservableObject
。在这里
汽车+CoreDataClass.swift
import Foundation
import CoreData
@objc(Car)
public class Car: NSManagedObject {
}
汽车+CoreDataProperties
extension Car : Encodable {
@nonobjc public dynamic class func fetchRequest() -> NSFetchRequest<Car> {
return NSFetchRequest<Car>(entityName: "Car")
}
@NSManaged public var model: String?
@NSManaged public var brand: String?
这是 TopPanel
问题的根源。
struct TopPanel: View {
@ObservedObject private var car:Car
@ObservedObject private var pageViewModel:PageViewModel
init(_ car:Car,
_ pageViewModel:PageViewModel?) {
self.car = car
self.pageViewModel = model
}
var body: some View {
Button(action: {
pageViewModel.delete(car)
}, label: {
Text("delete me")
})
请记住,TabView
显示的是 TopPanel
的页面,而此 TopPanel
有一个按钮,允许用户从 TabView
中删除自己。
问题是,当我在给定元素上按删除键时,它继续显示在 TabView
上,但 TabView
上的一个点被删除了。如果在那之后我尝试删除第二个,我会收到此消息:
*** Assertion failure in -[_TtC7SwiftUIP33_8825076C2763A50452A210CBE1FA4AF020PagingCollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:animator:collectionViewAnimator:], UICollectionView.m:6982
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete and reload the same index path (<NSIndexPath: 0xacce8bbd6a5ce2d8> {length = 2, path = 0 - 1})'
我该如何解决?
难以置信,我发现了如何解决这个问题,完全是偶然的。
只需添加
.id(pageViewModel.cars.count)
到 TabView。这将强制它在删除项目时更新。