gpt4 book ai didi

core-data - Swift UI - EnvironmentObject 更改不会更新 UI

转载 作者:行者123 更新时间:2023-12-04 10:56:57 28 4
gpt4 key购买 nike

关于以下问题,我正把头撞在 table 上。我有一个嵌套的 DataStore(为方便起见),通过@EnvironmentObject 集成到 View 中。如果我更改 DataStore 中的某些内容(例如,将新对象放入其中 - 工作正常 -),则 UI 不会更新。

在控制台中,我还得到了由于获取的结果发生变化而导致的 print("Object Changed") 的结果。但是用户界面只有在我重新启动应用程序后才会更新。这里有什么问题?

非常感谢!

我的测试代码如下所示:

数据存储:

import Foundation
import Combine

class DataStore : ObservableObject{
@Published var documents = DocumentStore()
@Published var attachments = AttachmentStore()
}


附件商店
//
// AttachmentStore.swift

import SwiftUI
import Combine
import CoreData

class AttachmentStore: NSObject, ObservableObject {


// MARK: Private Properties
let persistenceManager = PersistenceManager()

private lazy var fetchedResultsController: NSFetchedResultsController<ManagedAttachment> = {
let fetchRequest: NSFetchRequest<ManagedAttachment> = ManagedAttachment.fetchRequest()
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "dateCreated", ascending: false)]

let fetchedResultsController = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: self.persistenceManager.managedObjectContext,
sectionNameKeyPath: nil,
cacheName: nil)
fetchedResultsController.delegate = self
return fetchedResultsController
}()

private var attachment: [ManagedAttachment] {
return fetchedResultsController.fetchedObjects ?? []
}

// MARK: Public Properties

@Published var Items : [ManagedAttachment] = []

public var allItems: [ManagedAttachment] {
return self.attachment.filter {$0 == $0}
}

func setup(){
self.Items = allItems
}
// MARK: Object Lifecycle

override init() {
super.init()
fetchDocuments()
setup()
}

// MARK: Public Methods

public func allAttachments(for id: UUID) -> [ManagedAttachment]
{
let attachments = self.allItems.filter {$0.parentID == id}
return attachments
}

public func create(attachment: Attachment) {
ManagedAttachment.create(object: attachment, in: self.persistenceManager.managedObjectContext)
saveChanges()
}

public func delete(attachment: ManagedAttachment){
persistenceManager.managedObjectContext.delete(attachment)
self.saveChanges()
}

public func update(){
self.saveChanges()
}


// MARK: Private Methods

private func fetchDocuments() {
do {
try fetchedResultsController.performFetch()
dump(fetchedResultsController.sections)
} catch {
fatalError()
}
}

private func saveChanges() {
guard persistenceManager.managedObjectContext.hasChanges else { return }
do {
try persistenceManager.managedObjectContext.save()
self.objectWillChange.send()
print("Object Changed")
} catch { fatalError() }
}
}


extension AttachmentStore: NSFetchedResultsControllerDelegate {
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.objectWillChange.send()
print("Object Changed")
}
}



测试 View
import SwiftUI

struct TestView: View {
@EnvironmentObject var data : DataStore

var body: some View {
VStack{
Button(action: {
self.data.attachments.create(attachment: Attachment(url: "Test"))
}
) {
Text("Add")
}
// Print the Items in the DataStore
ForEach(data.attachments.Items, id:\.self){Item in
Text(Item.url).font(.caption)
}
}

}
}

最佳答案

好的,我的问题是我从附件存储发送 willChange - 但不是从数据存储发送,所以它没有更新。所以解决方案是手动调用dataStore.objectWillChange.send()。谢谢!

关于core-data - Swift UI - EnvironmentObject 更改不会更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59108467/

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