如何从UITableView的多个部分选择多行?

时间:2018-06-04 05:56:20

标签: ios objective-c uitableview

我必须从不同的部分实现多行选择。所以这是我的代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 EmailSelectionCell*cell;
cell = (EmailSelectionCell *)[tableView dequeueReusableCellWithIdentifier:@"EmailSelectionCell"];
if(cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"EmailSelectionCell" owner:self options:nil];
    cell = EmailSelectionCell;
}

NSArray *insuranceEmailArray = [[data objectAtIndex:indexPath.section] objectForKey:@"email"];


   [((EmailSelectionCell *) cell).lbl_name setText:[insuranceEmailArray objectAtIndex:indexPath.row]];

return cell;
}

在tableview单元格中

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{

[super setSelected:selected animated:animated];

if(selected){
    imgv_selectionBox.image = [UIImage imageNamed:@"tick_selected"];
}else{
    imgv_selectionBox.image = [UIImage imageNamed:@"tick_unselected"];
}

}

我的问题是setSelected在调试时调用了两次,还有一个问题就是它的行为类似于单选。我认为问题是由于部分,但我不知道如何处理它。所以请帮助解决这类问题。

2 个答案:

答案 0 :(得分:1)

当您应该实现委托方法setSelected时,您将覆盖单元格didSelectRowAt上的方法。您还可以使用indexPathsForSelectedRows在表格视图中随时获取选定的索引路径。

有一个设置可以选择独占行,或者可以使用allowsMultipleSelection选择多个行。因此,请确保将此设置为YES

您重写的方法似乎仍然合法,但我不确定它是否应该在您实施时起作用。如你所说,该方法被多次调用。为了使您的工作正常,当您滚动表格视图时也应该调用它。原因是您的单元格正在出列(这是表视图的工作方式),这意味着同一个单元格将用于多行;当你向下滚动一个将在顶部消失的单元格实际上将显示在底部作为重用。您的cellForRowAtIndexPath将被调用,因此您可能需要在那里更改图标。

答案 1 :(得分:0)

setSelected方法将调用两次,因为一个调用是取消选择先前的选择,第二个调用是当前选择的一个。实际上,您不应该在此方法中管理多个选择。您可以在didSelectRowAtIndexpath:方法中进行管理。在didSelectRowAtIndexpath方法中进行更改。并将选定的indexPaths添加到数组中。因此,如果滚动表格视图,则可以管理选择。

   func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell {

      =======
      cell initialisation
      =======

      if indexPathsArray.contains(indexPath) {
         imgv_selectionBox.image = [UIImage imageNamed:@"tick_selected"];
      }else{
         imgv_selectionBox.image = [UIImage imageNamed:@"tick_unselected"];
      }
     }

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath:  IndexPath)
     {
        if indexPathsArray.contains(indexPath) {
         ===remove index path here from array====
          imgv_selectionBox.image = [UIImage imageNamed:@"tick_selected"];
        }else{
         ====add index path to array
          imgv_selectionBox.image = [UIImage imageNamed:@"tick_unselected"];
        }
     }