gpt4 book ai didi

swift - TabView 上的元素删除后不消失

转载 作者:行者123 更新时间:2023-12-04 14:54:46 27 4
gpt4 key购买 nike

我有这门课:

class PageViewModel:ObservableObject {
@Published var cars = [Car]()

func delete(_ car:Car) {
cars = cars.filter { $0 != car }
}

}

然后我将此类传递给名为 PageView 的 View ,如下所示

@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。在这里

Car+CoreDataClass.swift

import Foundation
import CoreData

@objc(Car)
public class Car: NSManagedObject {
}

汽车+核心数据属性

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。这将强制它在删除项目时进行更新。

关于swift - TabView 上的元素删除后不消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68283552/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com