2

向选定的表格单元格添加复选标记时,我看到复选标记也出现在其他单元格中。

我的 didSelectRowAtIndexPathCode 是:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    PFObject *player = [squadListArray objectAtIndex:indexPath.row];
    NSString *playerName = [player valueForKey:@"fullName"];
    NSLog(@"%@", playerName);

    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

    selectedCell.accessoryType = UITableViewCellAccessoryCheckmark;
}

NSLog 有预期的结果,只显示一个选择。

有任何想法吗?您需要我显示任何其他代码吗?

谢谢

4

5 回答 5

2

在您cellForRowAtIndexPath的单元格被重用时,您无法正确配置单元格。您应该始终从数据模型中设置(和重置)单元格的所有属性。


您必须有一个数据模型,用于告诉表格视图它有多少行以及每个单元格应该是什么样子。在此期间didSelectRowAtIndexPath,您应该使用这些selected信息更新您的数据模型。然后,在 中cellForRowAtIndexPath,您可以使用数据模型中的信息来确定单元格是否具有复选标记。如果是,则添加它,如果不是,则显式删除它(以防止在重复使用单元格时将其留在那里)。

于 2013-08-09T19:10:43.577 回答
1

您的单元格正在被其他行回收。在方法中,cellforrowatindexpath在末尾添加以下行:

selectedCell.accessoryType = UITableViewCellAccessoryNone;
于 2013-08-09T19:10:46.283 回答
0

单元格被缓存并重新使用。您只需保存您被选中的事实(可能在 PFObject 中),然后在每次配置单元格时设置附件。

于 2013-08-09T19:11:09.570 回答
0

您可以尝试执行以下操作:

  1. 创建保存选定单元格索引的 NSMutableSet。

    @property(strong, nonatomic) NSMutableSet *selectedCells;
    
    
    -(NSMutableSet *)selectedCells{
        if(_selectedCells){
            return _selectedCells;
        }
        _selectedCells = [[NSMutableSet alloc]init];
        return _selectedCells;
    }
    
  2. 在 didSelect 上更新集合并选择单元格:

        -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
            UITableViewCell *cell =  [tableView cellForRowAtIndexPath:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
            [self.selectedCells addObject:indexPath];
            [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle];
        }
    
  3. 删除 didDEselect 上的 indexPath

    -(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        cell.accessoryType = UITableViewCellAccessoryNone;
        [self.selectedCells removeObject:indexPath];
    }
    
  4. 在 - 的里面

    - (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    

    将单元格更新为:

    if([self.selectedCells containsObject:indexPath]){
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else{
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    
于 2014-07-09T14:28:38.383 回答
0

您需要明确告诉您不希望其他单元格具有复选标记。

if ([self shouldSelectCell]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}
于 2014-04-08T14:37:09.887 回答