我想用一个按钮来改变sortDescriptor。
但如果我将变量"sorting"和"sortOrder"更改为@State变量,则会出现错误。
错误消息为:* 变量"self. fetchRequest"在初始化之前使用 *
@Environment(\.managedObjectContext) private var viewContext
@State var sorting: KeyPath = \Log.diveNr
@State var sortOrder: SortOrder = .forward
private var fetchRequest: FetchRequest<Log>
private var logs: FetchedResults<Log> {
fetchRequest.wrappedValue
}
init() {
fetchRequest = FetchRequest(sortDescriptors: [SortDescriptor(sorting, order: sortOrder)])
}
有人能帮我解决这个问题吗?
- 解决方案:**
@FetchRequest(sortDescriptors: [SortDescriptor(\.diveNr, order: .forward)])
var logs: FetchedResults<Log>
var body: some View {
NavigationStack {
List{
if logs.count == 0 {
Text("no Logs found")
}
Button("change order") {
logs.sortDescriptors = [SortDescriptor(\.diveNr, order: .reverse)]
}
ForEach(logs){log in
NavigationLink(destination: DiveLogDetailView(diveNo: 1, diveSite: "Vela Garska")) {
DiveLogListObject(log: log)
}
}
.onDelete(perform: deleteLog)
}
}
2条答案
按热度按时间vlf7wbxs1#
由于使用了
@State
,因此sorting
和sortOrder
都是计算属性。在初始化所有存储属性之前,不能在init
中使用计算属性。(否则,计算属性的getter可能会让未完全初始化的self
转义。)因此,请改用底层存储属性:
ffscu2ro2#
你必须在
body
中设置它。不幸的是@FetchRequest
的设计真的很糟糕。