如何将复选标记状态保存在核心数据中?
-
19-09-2019 - |
题
我有一个列表应用程序,用户可以点击+按钮并输入他们想要出现在列表中的项目,然后点击保存。该表与核心数据一起保存。唯一的问题是当单元格被粘贴时我想要显示一个复选标记。我启用了多重选择
UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
thisCell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
thisCell.accessoryType = UITableViewCellAccessoryNone;
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
我希望在用户退出后复选标记保留在单元格中。我在我的实体中创建了一个名为“检查”的属性,并为其指定了布尔类型,但我不知道如何使其在点击一行时出现检查并保留。任何帮助将不胜感激。谢谢
解决方案
我就是这样做的。值得注意的一点: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;
}
这就是一切如何联系在一起的
- 用户单击一行
- 表视图:didSelectRow...方法更改相应托管对象的“isDone”属性。
- 获取的结果控制器注意到托管对象已更改并调用
controllerDidChangeContent
其委托上的方法。 - 我的
controllerDidChangeContent
方法只是重新加载表视图中的所有数据 - 当 tableView 重新加载时,我的 tableView:cellForRow...方法检查托管项目的“isDone”属性,以查看单元格是否应具有复选标记。
为了让您不会感到困惑,我最初使用了通用的 NSMangagedObject
存储行状态,这就是为什么我发布的第一个方法说, [selectedObject valueForKey:@"isDone"]
. 。后来我切换到一个名为的子类托管对象 JKItem
, ,这就是为什么第二组方法能够使用 item.isDone
而不生成编译器警告。
不隶属于 StackOverflow