首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BindableObjects SwiftUI阵列

BindableObjects SwiftUI阵列
EN

Stack Overflow用户
提问于 2019-07-04 12:34:41
回答 1查看 1.1K关注 0票数 6

因此,我正在尝试用SwiftUI来设置SwiftUI,并且CoreData模型和SwiftUI视图都在工作。我所要做的就是把它们连接起来。我能够传递一个离散的BindableObjects数,但我需要的是传递一个数组。下面是设置:

代码语言:javascript
复制
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]符合?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-07 10:28:19

您可以使用NSFetchedResultsControllerDelegate实现BindableObject协议并在NSFetchedResultsController上转发更改。

代码语言:javascript
复制
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()
    }
}

在代码中,如下所示:

代码语言:javascript
复制
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上的实体。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56888087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档