如何在核心数据中保存复选标记状态?

时间:2010-02-07 01:06:27

标签: iphone core-data uitableview persist

我有一个列表应用程序,用户点击+按钮并输入他们想要在列表中显示的项目并点击保存。该表与核心数据一起保存。唯一的问题是当单元格被录音时我想要显示一个复选标记。我用

启用了多项选择
UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; 
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
    thisCell.accessoryType = UITableViewCellAccessoryCheckmark;  
} else {
    thisCell.accessoryType = UITableViewCellAccessoryNone;
} 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 

我想在用户退出后将复选标记保留在单元格中。我在我的实体中创建了一个名为“checks”的属性,并给它布尔类型,但我不知道如果你在一行中然后检查出现并保持不变的方法。任何帮助将不胜感激。感谢

1 个答案:

答案 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;
}

以下是一切联系在一起的方式

  1. 用户点击一行
  2. tableView:didSelectRow ...方法更改相应托管对象的“isDone”属性。
  3. 获取的结果控制器注意到托管对象已更改并在其委托上调用controllerDidChangeContent方法。
  4. 我的controllerDidChangeContent方法只是重新加载表格视图中的所有数据
  5. 当重新加载tableView时,我的tableView:cellForRow ...方法检查托管项目的“isDone”属性,以查看该单元格是否应该有复选标记。
  6. 这样你就不会感到困惑,我最初使用通用NSMangagedObject存储行状态,这就是我发布的第一个方法[selectedObject valueForKey:@"isDone"]。后来我切换到一个名为JKItem的子类管理对象,这就是为什么第二组方法能够使用item.isDone而不生成编译器警告的原因。