如何使用可可绑定使用NSObjectController和托管对象上下文

时间:2018-06-20 05:10:49

标签: macos core-data nsmanagedobjectcontext cocoa-bindings nsobjectcontroller

搜索了整个Internet,但找不到适合我的问题的现代解决方案。 我想通过可可绑定将NSObjectController与Core Data结合使用,并努力正确地进行设置。值得注意的是,我正在使用最新版本的Xcode和Swift。

我所做的事情:

出于测试目的,我已执行以下操作:

  1. 创建了一个macOS应用,并选择了“使用核心数据”选项(该应用基于文档);
  2. 将2个NSTextField拖到情节提要中拖拉NSObjectController到视图控制器场景;
  3. 将雇员实体添加到具有2个属性“名称”和“姓氏”的核心数据模型中;
  4. 完成How do I bind my Array Controller to my core data model?中答案中的所有内容
  5. 将NSObjectController设置为实体模式并输入“ Employee”,
  6. 准备内容,选择“使用懒惰获取”,以便选中所有三个选项;
  7. 在绑定检查器中将NSObjectController的Managed Object Context绑定到View Controller的managedObjectContext;
  8. 绑定NSTextField如下:-对象控制器,控制器键-选择,模型键路径-名称(用于第一个文本字段)和姓氏(第二名)。

就这样。

第一组问题:我做错了什么,如果不是完全错误的方法,该如何解决?

我在stackoverflow上读过一些文章,这样可以自动保存和从Core Data模型获取数据。这就是为什么我认为它应该可以工作的原因。

这是第二组问题: 是真的吗 如果是这样,为什么在显示视图时未填充文本字段? 如果不是,那么如何实现(尝试编写尽可能少的代码)?

第三个问题:如果我使用的方法完全错误,有人会帮助我使用Cocoa绑定连接Core Data和NSObjectController并向我展示使用尽可能少的代码编写的方法正确的方法?

考虑到野外没有关于该主题的新文章,我认为正确的答案可能会帮助正在开发macOS应用程序的许多人。

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您的基本方法是正确的,尽管重要的是要了解您需要一个 real 对象(一个实例)才能使其正常工作。

创建NSManagedObject子类通常是可取的,并且几乎总是在实际项目中完成的,因此您可以定义和使用属性。现在,您可以在Xcode的Project Navigator中选择数据模型,然后单击菜单: Editor > 创建NSManagedObject子类…,轻松地做到这一点。从技术上讲,这是没有必要的,并且在演示或概念验证中,您经常会混淆使用NSManagedObject。

假设您正在使用所描述的Xcode项目模板,其中AppDelegate具有属性managedObjectContext,则AppDelegate类中的以下函数将维护,在必要时创建并返回我所谓的内容单个对象 –特定实体的对象,在这种情况下为Employee,您的应用要求该实体在商店中必须只有一个。

@discardableResult func singularEmployee() -> NSManagedObject? {
    var singularEmployee: NSManagedObject? = nil
    let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest(entityName: "Employee")
    let objects = try? self.managedObjectContext.fetch(fetchRequest)
    singularEmployee = objects?.first

    if singularEmployee == nil {
        singularEmployee = NSEntityDescription.insertNewObject(forEntityName: "Employee", into: self.managedObjectContext)
    }
    return singularEmployee
}

然后,将这一行代码添加到applicationDidFinishLaunching

    singularEmployee()