1

我有一个 UITableView 用户应该能够选择(检查)多行。

我的控制器中有一个 NSMutableArray 来保存所选项目,在我的 cellForRowAtIndexPath 方法中,我检查项目是否在该数组中,并相应地以选中/未选中状态返回单元格。

这是代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = kContactCellReuseIdentifier;
    static NSString *searchIdentifier = kContactSearchCellReuseIdentifier;

    POContactCell *cell;

    // Configure the cell...
    if (tableView == self.tableView) {
        cell = (POContactCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
        cell.contact = self.contacts[indexPath.row];
        NSLog(@"Returned cell with name %@", cell.contact.name);
    } else {
        cell = (POContactCell*)[tableView dequeueReusableCellWithIdentifier:searchIdentifier forIndexPath:indexPath];
        cell.contact = self.searchResults[indexPath.row];
    }

    if ([self.selectedContacts containsObject:cell.contact])
    {
        NSLog(@"was checked");
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else
        cell.accessoryType = UITableViewCellAccessoryNone;

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    POContactCell* tappedCell = (POContactCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];

    NSLog(@"Selected contact %@", tappedCell.contact.name);
    if ([self.selectedContacts containsObject:tappedCell.contact]) {
        // cell is already selected, so deselect it
        NSLog(@"It's already selected, so deselect it");
        [self.selectedContacts removeObject:tappedCell.contact];
        tappedCell.accessoryType = UITableViewCellAccessoryNone;
    }
    else
    {
        NSLog(@"It's not already selected, so select it");
        [self.selectedContacts addObject:tappedCell.contact];
        tappedCell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:NO];
}

此代码有效...除了第一个选择。用户点击的第一个单元格将被选中并且永远不会被取消选中。我从日志语句中看到,所有单元格都经历了完全相同的过程,并且它也正确识别了第一个点击行的选择状态,即使附件视图没有反映它。

第一次选择后,所有其他行都可以正常工作。

任何调试想法?

4

1 回答 1

0

您应该将self.contacts[indexPath.row](或self.searchResults[indexPath.row]酌情)放入所选项目的数组中,并在用户点击单元格时检查这些对象是否存在于数组中。通过从数据源设置对象并在数组中cell.contact检查,您几乎可以做到这一点。cell.contact但我会尝试将对象直接放入您的数组中,例如

id contact = self.contacts[indexPath.row];
if ([self.selectedContacs containsObject:contact])
    ...

并停止检查是否cell.contact在数组中以确定“已选择”。

在内存UITableView中有一小部分实际UITableViewCell对象,它们会被重用。您的问题的根源很可能是这个,因为您正在检查是否cell.contact在您的选定项目集中;当一个单元格被重用时,除非你自己写prepareForReuse,你的自定义属性的先前值可能不会(可能不会)被清除。

那有意义吗?

于 2013-06-06T19:22:00.757 回答