SwiftUI中@State配置SortDescriptor初始化报错的解决方法
解决Core Data FetchRequest初始化错误及动态修改排序规则
问题说明
尝试通过按钮修改Core Data的SortDescriptor,将排序键路径sorting和排序顺序sortOrder改为@State变量时,触发错误:
Variable 'self.fetchRequest' used before being initialized
原代码如下:
@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)]) }
问题原因
@State变量的初始化时机晚于视图的init方法,在init中访问sorting和sortOrder时,这两个变量尚未完成初始化,导致无法正确创建FetchRequest。
解决方案
直接使用@FetchRequest属性包装器声明logs,无需手动初始化FetchRequest。后续可通过修改logs.sortDescriptors动态更新排序规则:
@FetchRequest(sortDescriptors: [SortDescriptor(\.diveNr, order: .forward)]) var logs: FetchedResults<Log> var body: some View { NavigationStack { List{ if logs.count == 0 { Text("未找到日志") } Button("切换排序顺序") { logs.sortDescriptors = [SortDescriptor(\.diveNr, order: .reverse)] } ForEach(logs){log in NavigationLink(destination: DiveLogDetailView(diveNo: 1, diveSite: "Vela Garska")) { DiveLogListObject(log: log) } } .onDelete(perform: deleteLog) } } }
内容的提问来源于stack exchange,提问作者luegm.dev
相关产品推荐
相关产品推荐

