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

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

这就是一切如何联系在一起的

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

为了让您不会感到困惑,我最初使用了通用的 NSMangagedObject 存储行状态,这就是为什么我发布的第一个方法说, [selectedObject valueForKey:@"isDone"]. 。后来我切换到一个名为的子类托管对象 JKItem, ,这就是为什么第二组方法能够使用 item.isDone 而不生成编译器警告。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top