Ios 在其他视图中更新核心数据属性时,SwiftUI列表不更新
现在,我推到“详细视图”一个对象:Ios 在其他视图中更新核心数据属性时,SwiftUI列表不更新,ios,core-data,swiftui,swiftui-list,Ios,Core Data,Swiftui,Swiftui List,现在,我推到“详细视图”一个对象: .onAppear(){ self.loadDocuments() } 在重命名文档视图中: NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!]), isActive: $pushActive) { Text("") }.hid
.onAppear(){
self.loadDocuments()
}
在重命名文档视图中:
NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!]), isActive: $pushActive) {
Text("")
}.hidden()
此外,还有一个更新文档名称的函数:
var document: ScanDocument
所有这些代码都有效。此打印语句始终打印更新的值:
func renameDocument() {
guard !fileName.isEmpty else {return}
document.name = fileName
try? self.moc.save()
print(fileName)
self.presentationMode.wrappedValue.dismiss()
}
以下是主视图中的列表代码:
print(documents.compactMap({$0.name}))
但用户返回到上一个屏幕。该列表显示旧数据。如果我重新启动应用程序,它会显示新数据
任何朝着新方向推动的帮助都会有所帮助
这里有一个类似的问题:,但没有答案。
NSManagedObject
是一个引用类型,因此当您更改其属性时,文档不会更改,因此状态不会刷新视图
这里有一种可能的方法,可以在您返回时强制刷新列表
添加新状态
由it确定的制造清单
备选方案:可能的备选方案是让DocumentCell
观察文档,但没有提供代码,因此不清楚里面是什么。无论如何你可以试试
NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!])
.onDisappear(perform: {self.refreshID = UUID()}),
isActive: $pushActive) {
Text("")
}.hidden()
核心数据批处理更新不会更新内存中的对象。之后必须手动刷新
批处理操作绕过正常的核心数据操作,直接在底层SQLite数据库(或支持持久存储的任何数据库)上操作。它们这样做是为了提高速度,但这意味着它们也不会触发使用普通获取请求获得的所有内容
您需要执行类似于《苹果核心数据批处理编程指南:实施批处理更新-执行后更新应用程序》中所示的操作
let request=NSBatchUpdateRequest(实体:scandDocument.entity())
request.resultType=.UpdateObjectDSResultType
让result=try viewContext.execute(request)as?NSBatchUpdateResult
让ObjectDarray=结果?结果为?[NSManagedObjectID]
let changes=[nsUpdate对象skey:ObjectDarray]
NSManagedObjectContext.mergeChanges(从RemoteContextSave:changes,到:[managedContext])
List(documents, id: \.id) { item in
ZStack {
DocumentCell(document: item)
}
}
@State var documents: [ScanDocument] = []
@State private var refreshID = UUID() // can be actually anything, but unique
List(documents, id: \.id) { item in
ZStack {
DocumentCell(document: item)
}
}.id(refreshID) // << here
NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!])
.onDisappear(perform: {self.refreshID = UUID()}),
isActive: $pushActive) {
Text("")
}.hidden()
struct DocumentCell: View {
@ObservedObject document: ScanDocument
...
}