我正在使用swiftUI和Core Data构建Todo应用程序。在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()中的predicate属性将更新fetchrequest,然后listview将重新加载。
我知道这种方法有问题,但是我不知道如何解决。感谢您的帮助!
您需要更改某些状态,以便视图重新呈现。
尝试添加@State
变量,从按钮操作中更改它,并在视图中使用它:
struct HomeListView: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(fetchRequest: ItemEntity.loadItems()) var items: FetchedResults<ItemEntity>
@State private var refresh: Bool = false // add a state
var body: some View {
Text("someText")
.onTapGesture {
ItemEntity.predicateType.next()
refresh.toggle() // change the state
}
.background(toggle ? Color.clear : Color.clear) // use the state
}
}