如何使用 Cocoa 绑定来使用 NSObjectController 和托管对象上下文
How to use NSObjectController and Managed Object Context using Cocoa Bindings
搜索了整个 Internet,但找不到适合我问题的现代解决方案。
我想通过 Cocoa 绑定将 NSObjectController 与核心数据配对使用,并努力正确设置它。值得注意的是,我使用的是最新版本的 Xcode 和 Swift。
我做了什么:
出于测试目的,我做了以下操作:
- 创建了一个选中“使用核心数据”选项的 macOS 应用程序(该应用程序不基于文档);
- 将 2 个 NSTextFields 拖入 Storyboard 将 NSObjectController 拖入视图控制器场景;
- 将员工实体添加到核心数据模型中,具有 2 个属性“name”和“surname”;
- 完成
中的所有答案
- 将 NSObjectController 设置为实体模式并输入“Employee”,
- 选择准备内容,选择使用延迟获取,所以三个选项都被选中;
- 在绑定检查器中将 NSObjectController 的托管对象上下文绑定到视图控制器的 managedObjectContext;
- 绑定NSTextFields如下:Value - Object Controller,Controller key - selection,Model Key Path - 姓名(第一个文本字段)和姓氏(第二个)。
就是这样。
第一组问题:我做错了什么,如果不是完全错误的做法,如何改正?
我在 Whosebug 上的一些 post 中读到,这样做允许自动保存和从 Core Data 模型中获取。这就是为什么我认为它应该有效。
所以这是第二组问题:
是真的吗?
如果是那么为什么在显示视图时文本字段没有被填充?
如果不是那么如何实现(尽量少写代码)?
第三个问题:如果我使用的方法是完全错误的,有人会帮助我使用 Cocoa 绑定来连接 Core Data 和 NSObjectController 并告诉我怎么做吗所以使用正确的方法编写尽可能少的代码?
考虑到在野外没有关于这个话题的新鲜 post 我认为正确的答案可以帮助很多正在开发 macOS 应用程序的人。
提前致谢!
我认为您的基本方法是正确的,但重要的是要了解您需要一个 真实的 对象,一个实例,才能使其工作。
创建 NSManagedObject 子class 通常是可取的,并且几乎总是在实际项目中完成,因此您可以定义和使用属性。现在,您可以通过在 Xcode 的项目导航器中选择数据模型并单击菜单轻松地完成此操作:Editor > Create NSManagedObject Subclass…。从技术上讲,这不是必需的,并且在演示或概念验证中,您经常会用 NSManagedObject 蒙混过关。
假设您正在使用您描述的Xcode项目模板,其中AppDelegate
有一个属性managedObjectContext
,您的AppDelegate中的以下函数class 将维护,在必要时创建,并且 return,我称之为 单一对象 – 特定实体的对象,在本例中为 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()
搜索了整个 Internet,但找不到适合我问题的现代解决方案。 我想通过 Cocoa 绑定将 NSObjectController 与核心数据配对使用,并努力正确设置它。值得注意的是,我使用的是最新版本的 Xcode 和 Swift。
我做了什么:
出于测试目的,我做了以下操作:
- 创建了一个选中“使用核心数据”选项的 macOS 应用程序(该应用程序不基于文档);
- 将 2 个 NSTextFields 拖入 Storyboard 将 NSObjectController 拖入视图控制器场景;
- 将员工实体添加到核心数据模型中,具有 2 个属性“name”和“surname”;
- 完成
- 将 NSObjectController 设置为实体模式并输入“Employee”,
- 选择准备内容,选择使用延迟获取,所以三个选项都被选中;
- 在绑定检查器中将 NSObjectController 的托管对象上下文绑定到视图控制器的 managedObjectContext;
- 绑定NSTextFields如下:Value - Object Controller,Controller key - selection,Model Key Path - 姓名(第一个文本字段)和姓氏(第二个)。
就是这样。
第一组问题:我做错了什么,如果不是完全错误的做法,如何改正?
我在 Whosebug 上的一些 post 中读到,这样做允许自动保存和从 Core Data 模型中获取。这就是为什么我认为它应该有效。
所以这是第二组问题: 是真的吗? 如果是那么为什么在显示视图时文本字段没有被填充? 如果不是那么如何实现(尽量少写代码)?
第三个问题:如果我使用的方法是完全错误的,有人会帮助我使用 Cocoa 绑定来连接 Core Data 和 NSObjectController 并告诉我怎么做吗所以使用正确的方法编写尽可能少的代码?
考虑到在野外没有关于这个话题的新鲜 post 我认为正确的答案可以帮助很多正在开发 macOS 应用程序的人。
提前致谢!
我认为您的基本方法是正确的,但重要的是要了解您需要一个 真实的 对象,一个实例,才能使其工作。
创建 NSManagedObject 子class 通常是可取的,并且几乎总是在实际项目中完成,因此您可以定义和使用属性。现在,您可以通过在 Xcode 的项目导航器中选择数据模型并单击菜单轻松地完成此操作:Editor > Create NSManagedObject Subclass…。从技术上讲,这不是必需的,并且在演示或概念验证中,您经常会用 NSManagedObject 蒙混过关。
假设您正在使用您描述的Xcode项目模板,其中AppDelegate
有一个属性managedObjectContext
,您的AppDelegate中的以下函数class 将维护,在必要时创建,并且 return,我称之为 单一对象 – 特定实体的对象,在本例中为 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()