向所选表格单元格添加复选标记还会检查另一个表格单元格

时间:2013-08-09 19:03:59

标签: ios uitableview

在选定的表格单元格中添加复选标记时,我也会在其他单元格中看到检查。

我的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期望结果,只显示一个选择。

有什么想法吗?你需要我展示任何其他代码吗?

由于

5 个答案:

答案 0 :(得分:2)

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


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

答案 1 :(得分:1)

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

selectedCell.accessoryType = UITableViewCellAccessoryNone;

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

if ([self shouldSelectCell]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}

答案 4 :(得分: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;
    }