【问题标题】:Array of BindableObjects SwiftUIBindableObjects SwiftUI 数组
【发布时间】:2019-11-15 04:54:12
【问题描述】:

所以我正在尝试使用 SwiftUI 设置 CoreData,并且 CoreData 模型和 SwiftUI 视图都可以正常工作。我需要做的就是连接它们。我能够传递离散数量的 BindableObjects,但我需要传递一个数组。这是设置:

let peristence = PersistenceManager()
var model = [Entry]() // Entry Conforms to NSManagedObject and BindableObject
let request = Entry.createFetchRequest()
let sort = NSSortDescriptor(key: "callsign", ascending: true)
request.sortDescriptors = [sort]
do {
    model = try peristence.persistenceContainer.viewContext.fetch(request)
} catch {
    fatalError(error.localizedDescription)
}

if let windowScene = scene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(model))

这会产生以下错误:

实例方法'environmentObject'要求'[Entry]'符合'BindableObject'

如何使[Entry] 符合要求?

【问题讨论】:

    标签: swift core-data protocols swiftui


    【解决方案1】:

    您可以使用实现 BindableObject 协议的 NSFetchedResultsControllerDelegate 并将更改转发到 NSFetchedResultsController

    class BindableFetchedResults<ResultType>: NSObject, BindableObject, NSFetchedResultsControllerDelegate where ResultType : NSFetchRequestResult {
    
        let controller: NSFetchedResultsController<ResultType>
        var results: [ResultType]? {
            controller.fetchedObjects
        }
        let didChange = PassthroughSubject<Void, Never>()
    
        init?(fetchRequest: NSFetchRequest<ResultType>, managedObjectContext context: NSManagedObjectContext) {
            self.controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
            super.init()
            self.controller.delegate = self
            do {
                try controller.performFetch()
            } catch {
                return nil
            }
        }
    
        func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
            didChange.send()
        }
    }
    
    

    在代码中是这样的:

    
    let persistence = PersistenceManager()
    let request = Entry.createFetchRequest()
    let sort = NSSortDescriptor(key: "callsign", ascending: true)
    request.sortDescriptors = [sort]
    
    guard let model =  BindableFetchedResults(fetchRequest: request, managedObjectContext: persistence.persistenceContainer.viewContext) else {
        fatalError()
    }
    
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(model))
    

    然后你就可以访问model.results上的实体了

    【讨论】:

      猜你喜欢
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多