【发布时间】:2020-07-06 15:21:23
【问题描述】:
编辑:到目前为止,我认为我已经将问题范围缩小到 listview 中的 fetchresult。 当 fetchrequest(predicate) 改变时,它不会重新获取。
我正在使用 swiftUI 和 Core Data 构建一个待办事项应用程序。 在 listView 我有一个按钮可以更改 fetchrequest 的谓词,但我无法让它工作。
listView 中的代码
struct HomeListView: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(fetchRequest: ItemEntity.loadItems()) var items: FetchedResults<ItemEntity>
Text("someText")
.onTapGesture {
ItemEntity.predicateType.next() //next() is a method defined in core data entity class
}
核心数据实体类中的代码
extension ItemEntity {
static var sortType = sort.ascending
static var predicateType = predicate.all
static func loadItems() -> NSFetchRequest<ItemEntity> {
var request: NSFetchRequest<ItemEntity> = ItemEntity.fetchRequest() as! NSFetchRequest<ItemEntity>
var predicate: NSPredicate {
switch predicateType {
case .all:
return NSPredicate(format: "type = %i", 0)
case .imur:
return NSPredicate(format: "type = %i", 0)
case .unimur:
return NSPredicate(format: "type = %i", 1)
case .imunur:
return NSPredicate(format: "type = %i", 2)
case .unimunur:
return NSPredicate(format: "type = %i", 3)
case .entry:
return NSPredicate(format: "type = %i", 4)
}
request.sortDescriptors = [sortDescriptor]
request.predicate = predicate
return request
}
enum predicate {
case all
case imur
case unimur
case imunur
case unimunur
case entry
mutating func next() {
switch self {
case .all:
self = .imur
case .imur:
self = .unimur
case .unimur:
self = .imunur
case .imunur:
self = .unimunur
case .unimunur:
self = .entry
case .entry:
self = .all
}
}
}
}
这个想法是当用户点击列表视图上的按钮时,它调用 next() 方法并将 ItemEntity 类中的 predicateType 属性设置为另一个值,然后 loadItems() 中的谓词属性将更新 fetchrequest,然后是列表视图将重新加载。
我知道这种方法有问题,但我不知道如何解决它。 感谢您的帮助!
【问题讨论】:
标签: core-data swiftui nsfetchrequest