当选中复选框时,不会调用didDeselectRowAtIndexPath

时间:2017-06-03 06:19:50

标签: ios objective-c uitableview checkbox

我使用带有复选框的UITableView。在我的cellForRowAtIndexPath方法中,我按如下方式设置了一些选定的单元格,

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];


if(tableView == self.sideBarTbl){
    cell.textLabel.text = [titleArray objectAtIndex:indexPath.row];
    cell.tag = indexPath.row;
    if(indexPath.row == 0){
        [cell setSelected:true];
    }else if(indexPath.row == 1){
        [cell setSelected:true];
    }else {
        [cell setSelected:false];
    }
}

简而言之,如果行是0,1那么我会检查UITableView的复选框。

当用户单击第0行或第1行时,它应该调用didDeselectRowAtIndexPath,因为已经检查了第0行和第1行复选标记。但是,它总是调用didSelectRowAtIndexPath。无论是否选中该复选框,它始终会调用didSelectRowAtIndexPath。选中此复选框后,如何让其致电didDeselectRowAtIndexPath,如果未选中该复选框,请致电didSelectRowAtIndexPath

2 个答案:

答案 0 :(得分:2)

didDeselectRowAtIndexPath方法仅针对之前已被触摸的单元格调用。它与单元格的selected属性无关。如果要为取消选择的单元格执行某些操作,只需使用didSelectRowAtIndexPath方法在NSMutableArray中手动记录选择。忘记didDeselectRowAtIndexPath。供参考:UITableView cell on double click should go to previous state

以及Objective-C示例:

@interface SomeViewController : UIViewController<UITableViewDelegate> {
    NSMutableArray *selectedIndexPaths;
}

@implementation SomeViewController
//......
- (void)viewDidLoad {
    [super viewDidLoad];
    selectedIndexPaths = [NSMutableArray array];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([selectedIndexPaths containsObject:indexPath]) {
        [selectedIndexPaths removeObject:indexPath];
        //Do something when deselecting.
    }
    else{
        [selectedIndexPaths addObject:indexPath];
        //Do something when selecting.
    }
}
//......
@end

如果选择是单一且独占的,就像放射线框一样,在处理前一个选定单元格的取消选择过程之后,只需使用单个变量NSIndexPath *selectedIndexPath;来记录didSelectRowAtIndexPath中的选择。

答案 1 :(得分:1)

cellForRowAtIndexPath而不是[cell setSelected:true];

中使用以下代码
  [tableView  selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];`

当用户想要取消选择时,请使用以下代码。在didDeselectRowAtIndexPath

中使用它

[tableView deselectRowAtIndexPath:indexPath animated:YES];

最后,您可以按如下方式获取所选索引,

-(void) getSelectedIndices
{
    NSArray *indexPathArray = [tableView  indexPathsForSelectedRows];
    for(NSIndexPath *index in indexPathArray)
    {
        NSLog(@"Index: %ld",(long)index.row);
    }
}

如果您有任何疑问,请退回