首先,让我解释一下我要完成的任务。我有一个带有 MasterViewController 和 EditViewController 的主从应用程序。 MasterViewController 包含一个添加按钮和一个列出核心数据实体的表。当用户点击表行或添加按钮时,应弹出编辑 View 。我对如何以不同方式处理编辑和添加感到困惑。
这是我目前的做法:我的应用程序使用 Storyboard,所以我有 editEntity
和 addEntity
从 Master 到 Edit 的 segues。两个 segue 都将一个实体传递给 EditViewController,但 editEntity
根据点击的行找到一个现有实体,而 addEntity
创建一个新实体。两个 segues 都在实体上设置了 isNew
transient 属性。
EditViewController 对核心数据一无所知——它只是编辑给定的实体。它依次具有 done
和 cancel
展开操作。 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/