ios - 编辑/添加具有相同 View 的核心数据实体?

标签 ios core-data

首先,让我解释一下我要完成的任务。我有一个带有 MasterViewController 和 EditViewController 的主从应用程序。 MasterViewController 包含一个添加按钮和一个列出核心数据实体的表。当用户点击表行或添加按钮时,应弹出编辑 View 。我对如何以不同方式处理编辑和添加感到困惑。

这是我目前的做法:我的应用程序使用 Storyboard,所以我有 editEntityaddEntity 从 Master 到 Edit 的 segues。两个 segue 都将一个实体传递给 EditViewController,但 editEntity 根据点击的行找到一个现有实体,而 addEntity 创建一个新实体。两个 segues 都在实体上设置了 isNew transient 属性。

EditViewController 对核心数据一无所知——它只是编辑给定的实体。它依次具有 donecancel 展开操作。 MasterViewController 在考虑 cancel 时查看 isNew 属性——如果实体是新的,它会删除它,如果它已经存在,它就不会应用更改。

这可行,但有几个问题。首先,向实体添加额外的属性似乎有点麻烦。其次,如果用户在编辑新实体时在 Edit View 上关闭应用程序,则该实体不会被删除,这肯定是出乎意料的。最重要的是,这似乎是一个 Core Data 本身必须有解决方案的问题——我只是不知道如何解决。非常感谢!

最佳答案

最简单的改进是用编辑 View Controller 上的标志替换实体描述上的 isNew 标志。编辑 VC 可能对核心数据一无所知,但可以让它知道它正在编辑的对象是新的还是已经存在的。在那里设置标志,让主 VC 在决定如何继续之前检查该值。不要将它放在您的实体描述中,它不是您需要保留的数据。

我在这种情况下所做的是创建新实例,但还没有将它插入到托管对象上下文中。有点像

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:[self managedObjectContext]];
NSManagedObject *myObj = [[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil];

在创建实例时为第二个参数传递 nil 会为您提供一个尚未插入的实例。将其传递给编辑 View Controller 。

如果用户点击保存按钮,您可以稍后将其插入:

if ([myObj managedObjectContext] == nil) {
    [[self managedObjectContext] insertObject:myObj];
}

由于尚未插入对象,因此它没有托管对象上下文,因此检查该属性会告诉您是否插入它。 不要在此处使用 isInserted 属性,它不会执行您需要的操作。在任何一种情况下都保存更改。

如果用户点击“取消”,则不要插入它。该对象像任何其他对象一样被释放,并且永远不会进入持久存储。由于您从未插入过它,因此无需费心删除它。

关于ios - 编辑/添加具有相同 View 的核心数据实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17202224/

相关文章:

ios - API - Microsoft Cognitive Services Face,如何返回属性

ios - 核心数据 - 为什么获取请求返回零?

ios - 如何从一对多关系中删除所有托管对象?

ios - 使用facebook 3.1 SDK从ios应用程序在facebook上发布状态

iphone - 如果 UITextField 为空则显示 UIAlert

ios - 核心数据提交通知

ios - 如何将数据预加载到 iOS 的数据库中?

swift - 撤消麻烦 : Initialise `NSPersistentDocument` programmatically without "edited" flag in title bar

ios - UIImagePickerController教程?

ios - 您能知道用户是第一次安装您的应用还是进行了更新?