当 UserDefaults 值更改 SwiftUI 时,@FetchRequest 谓词不更新
@FetchRequest predicate not updating when UserDefaults value changes SwiftUI
我无法弄清楚如何使 SwiftUI @FetchRequest
仅在 UserDefaults
中存储的布尔值是 true
时才使用谓词。
问题是当 showAvailable
的值改变时 FetchedResults
没有改变。目前我必须重新启动应用程序才能看到基于 showAvailable
值的结果。
struct ContentView: View {
@AppStorage("showAvailable") private var showAvailable : Bool = false
@FetchRequest private var list: FetchedResults<Item>
init() {
@AppStorage("showAvailable") var showAvailable : Bool = false
_list = FetchRequest(
sortDescriptors: [],
predicate: showAvailable ? NSPredicate(format: "parent == nil") : nil,
animation: .default
)
}
var body: some View {
Button("Cancel") {
showAvailable.toggle()
}
}
我会在 Button 操作中使用新谓词更新获取请求,该更新应该会触发请求再次执行
struct ContentView: View {
@AppStorage("showAvailable") private var showAvailable : Bool = false
@FetchRequest(sortDescriptors: [],
predicate: NSPredicate(value: true)
animation: .default)
private var list: FetchedResults<Item>
var body: some View {
Button("Cancel") {
showAvailable.toggle()
updatePredicate()
}
.onAppear {
updatePredicate()
}
}
private func updatePredicate() {
if showAvailable {
list.nspredicate = NSPredicate(format: "parent == nil")
} else {
list.nspredicate = NSPredicate(value: true)
}
}
}
我无法弄清楚如何使 SwiftUI @FetchRequest
仅在 UserDefaults
中存储的布尔值是 true
时才使用谓词。
问题是当 showAvailable
的值改变时 FetchedResults
没有改变。目前我必须重新启动应用程序才能看到基于 showAvailable
值的结果。
struct ContentView: View {
@AppStorage("showAvailable") private var showAvailable : Bool = false
@FetchRequest private var list: FetchedResults<Item>
init() {
@AppStorage("showAvailable") var showAvailable : Bool = false
_list = FetchRequest(
sortDescriptors: [],
predicate: showAvailable ? NSPredicate(format: "parent == nil") : nil,
animation: .default
)
}
var body: some View {
Button("Cancel") {
showAvailable.toggle()
}
}
我会在 Button 操作中使用新谓词更新获取请求,该更新应该会触发请求再次执行
struct ContentView: View {
@AppStorage("showAvailable") private var showAvailable : Bool = false
@FetchRequest(sortDescriptors: [],
predicate: NSPredicate(value: true)
animation: .default)
private var list: FetchedResults<Item>
var body: some View {
Button("Cancel") {
showAvailable.toggle()
updatePredicate()
}
.onAppear {
updatePredicate()
}
}
private func updatePredicate() {
if showAvailable {
list.nspredicate = NSPredicate(format: "parent == nil")
} else {
list.nspredicate = NSPredicate(value: true)
}
}
}