gpt4 book ai didi

ios - 在其他 View 中更新核心数据属性时,SwiftUI 列表不会更新

转载 作者:行者123 更新时间:2023-12-01 21:29:41 25 4
gpt4 key购买 nike

@State var documents: [ScanDocument] = []

func loadDocuments() {
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}

let managedContext =
appDelegate.persistentContainer.viewContext

let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "ScanDocument")

do {
documents = try managedContext.fetch(fetchRequest) as! [ScanDocument]
print(documents.compactMap({$0.name}))
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
}
在第一个 View 中:
.onAppear(){
self.loadDocuments()
}
现在我正在插入详细查看单个对象:
NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!]), isActive: $pushActive) {
Text("")
}.hidden()
在重命名文档 View 中:
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}))
这是主 View 中的列表代码:
List(documents, id: \.id) { item in
ZStack {
DocumentCell(document: item)
}
}
但是用户回到上一个屏幕的地方。该列表显示旧数据。如果我重新启动应用程序,它会显示新数据。
任何插入新方向的帮助都会有所帮助。
这里有一个类似的问题: SwiftUI List View not updating after Core Data entity updated in another View ,但它没有答案。

最佳答案

NSManagedObject是一个引用类型,所以当你改变它的属性时,你的 documents未更改,因此状态不会刷新 View 。
这是您回来时强制刷新列表的可能方法

  • 添加新状态
  • @State var documents: [ScanDocument] = []
    @State private var refreshID = UUID() // can be actually anything, but unique
  • make 由它标识的列表
  • List(documents, id: \.id) { item in
    ZStack {
    DocumentCell(document: item)
    }
    }.id(refreshID) // << here
  • 回来时更改refreshID,以便强制重建列表
  • NavigationLink(destination: RenameDocumentView(document: documents[selectedDocumentIndex!])
    .onDisappear(perform: {self.refreshID = UUID()}),
    isActive: $pushActive) {
    Text("")
    }.hidden()
    替代:可能的替代方法是使 DocumentCell观察文档,但没有提供代码,所以不清楚里面是什么。反正你可以试试
    struct DocumentCell: View {
    @ObservedObject document: ScanDocument

    ...
    }

    关于ios - 在其他 View 中更新核心数据属性时,SwiftUI 列表不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63101033/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com