3

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

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

EditViewController 对核心数据一无所知——它只是编辑它给定的实体。它反过来有donecancel放松的行动。MasterViewController 在isNew考虑时会查看属性——如果cancel实体是新的,它将删除它,如果它已经存在,它根本不应用更改。

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

4

1 回答 1

2

最简单的改进是将isNew实体描述上的标志替换为编辑视图控制器上的标志。编辑 VC 可能对 Core Data 一无所知,但可以让它知道它正在编辑的对象是新的还是预先存在的。在此处设置标志,并让主 VC 在决定如何继续之前检查该值。不要把它放在你的实体描述中,它不是你需要保留的数据。

在这种情况下,我所做的是创建新实例,但尚未将其插入托管对象上下文中。就像是

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

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

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

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

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

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

于 2013-06-19T23:33:03.593 回答