我有一个列表应用程序,用户点击+按钮并输入他们想要在列表中显示的项目并点击保存。该表与核心数据一起保存。唯一的问题是当单元格被录音时我想要显示一个复选标记。我用
启用了多项选择UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
thisCell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
thisCell.accessoryType = UITableViewCellAccessoryNone;
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
我想在用户退出后将复选标记保留在单元格中。我在我的实体中创建了一个名为“checks”的属性,并给它布尔类型,但我不知道如果你在一行中然后检查出现并保持不变的方法。任何帮助将不胜感激。感谢
答案 0 :(得分:7)
我就是这样做的。一个值得注意的观点:CoreData不存储布尔值,因此标记为“boolean”的任何属性实际上都是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
的委托,因此我在查询^^^中对托管对象所做的更改将导致运行以下两种方法。 / p>
- (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;
}
以下是一切联系在一起的方式
controllerDidChangeContent
方法。controllerDidChangeContent
方法只是重新加载表格视图中的所有数据这样你就不会感到困惑,我最初使用通用NSMangagedObject
存储行状态,这就是我发布的第一个方法[selectedObject valueForKey:@"isDone"]
。后来我切换到一个名为JKItem
的子类管理对象,这就是为什么第二组方法能够使用item.isDone
而不生成编译器警告的原因。