我就是这样做的。值得注意的一点:CoreData 不存储布尔值,因此任何标记为“布尔”的属性实际上都是类型NSNumber
。在处理 CoreData 和布尔值时,您必须记住来回转换。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
if ([[selectedObject valueForKey:@"isDone"] boolValue]) {
[selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"isDone"];
} else {
[selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"isDone"];
}
}
我将我的UITableViewController
设置设置为 的委托NSFetchedResultsController
,因此我在查询 ^^^ 中对托管对象所做的更改将导致以下两种方法运行。
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *defaultCellIdentifier = @"Item";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:defaultCellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:defaultCellIdentifier] autorelease];
}
NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath];
cell.textLabel.text = [item valueForKey:@"name"];
if ([[item valueForKey:@"checks"] boolValue]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
这就是一切联系在一起的方式
- 用户点击一行
- tableView:didSelectRow... 方法更改相应托管对象的“isDone”属性。
- 获取的结果控制器注意到托管对象已更改并调用
controllerDidChangeContent
其委托上的方法。
- 我的
controllerDidChangeContent
方法只是重新加载表视图中的所有数据
- 当 tableView 重新加载时,我的 tableView:cellForRow... 方法会检查托管项目的“isDone”属性以查看单元格是否应该有复选标记。
为了避免混淆,我最初使用泛型NSMangagedObject
来存储行状态,这就是为什么我发布的第一个方法说[selectedObject valueForKey:@"isDone"]
. 后来我切换到一个名为 的子类托管对象JKItem
,这就是为什么第二组方法能够在item.isDone
不生成编译器警告的情况下使用的原因。