1

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

UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; 
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
    thisCell.accessoryType = UITableViewCellAccessoryCheckmark;  
} else {
    thisCell.accessoryType = UITableViewCellAccessoryNone;
} 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 

我希望用户退出后将复选标记保留在单元格中。我在我的实体中创建了一个名为“checks”的属性,并为其指定了布尔类型,但我不知道如何使它在你点击一行时出现并保留。任何帮助将不胜感激。谢谢

4

1 回答 1

7

我就是这样做的。值得注意的一点: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;
}

这就是一切联系在一起的方式

  1. 用户点击一行
  2. tableView:didSelectRow... 方法更改相应托管对象的“isDone”属性。
  3. 获取的结果控制器注意到托管对象已更改并调用controllerDidChangeContent其委托上的方法。
  4. 我的controllerDidChangeContent方法只是重新加载表视图中的所有数据
  5. 当 tableView 重新加载时,我的 tableView:cellForRow... 方法会检查托管项目的“isDone”属性以查看单元格是否应该有复选标记。

为了避免混淆,我最初使用泛型NSMangagedObject来存储行状态,这就是为什么我发布的第一个方法说[selectedObject valueForKey:@"isDone"]. 后来我切换到一个名为 的子类托管对象JKItem,这就是为什么第二组方法能够在item.isDone不生成编译器警告的情况下使用的原因。

于 2010-02-07T01:10:52.407 回答