在UITableView IOS中选择行时多次checkMark

时间:2014-05-18 21:54:00

标签: ios objective-c uitableview didselectrowatindexpath

我有一个UITableView,当选择一行时会显示复选标记。问题是当我在didSelectRowAtIndexPath中选择一行并在所选行上添加一个复选标记时,它会添加一个额外的复选标记。这是我的代码

非常感谢任何帮助。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    // Configure the cell...

    cell.textLabel.text=[[Model.category objectAtIndex:indexPath.row] categoryName];

    cell.imageView.image=[[Model.category objectAtIndex:indexPath.row]categoryImage];

    //cell.detailTextLabel.text =@"Breve Descripción de la categoria";

    return cell;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    if ([self.tableView cellForRowAtIndexPath:indexPath].accessoryType == UITableViewCellAccessoryCheckmark) {

 [self.tableView cellForRowAtIndexPath:indexPath].accessoryType =UITableViewCellAccessoryNone;

 [self.cellSelected removeObject:indexPath];

    }else {

     [tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;

        [self.cellSelected addObject:indexPath];

    }

   [self checkMark];

   [tableView reloadData];   
}

- (void)checkMark{

    for (NSIndexPath * indexPath in self.cellSelected) {

       [self.tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;

    }


}

2 个答案:

答案 0 :(得分:41)

[self.tableView cellForRowAtIndexPath:indexPath]中的{p> didSelectRowAtIndexPath来电不会返回确切的单元格。它可以是相同的细胞,新细胞或重复使用的细胞。如果它是附件视图中的重用单元格有复选标记,则最终会有两个带复选标记的单元格。

最好存储在数组中并相应地使用它。如果您计划进行多项选择,请使用下面的代码示例。

- (void)viewDidLoad
{
    [super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.
    self.cellSelected = [NSMutableArray array];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   //Cell Initialisation here

    if ([self.cellSelected containsObject:indexPath])
    {
      cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else
    {
      cell.accessoryType = UITableViewCellAccessoryNone;

    }
    return cell;
}


 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    //if you want only one cell to be selected use a local NSIndexPath property instead of array. and use the code below
   //self.selectedIndexPath = indexPath;

    //the below code will allow multiple selection
    if ([self.cellSelected containsObject:indexPath])
    {
      [self.cellSelected removeObject:indexPath];
    }
    else
    {
       [self.cellSelected addObject:indexPath];
    }
    [tableView reloadData];
}

答案 1 :(得分:4)

试试这个:

在您的.m文件中声明:

@interface MyViewController () {
        NSIndexPath *__selectedPath;
    }

tableView:cellForRowAtIndexPath:中检查给定的indexPath是否与ivar中存储的相同:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {       
    //configure cell

    if ([__selectedPath isEqual:indexPath]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

tableView:didSelectRowAtIndexPath存储指向所选NSIndexPath的指针,如果单元格已取消选择,则为nil

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    if (cell.accessoryType == UITableViewCellAccessoryNone) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        __selectedPath = indexPath;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
        __selectedPath = nil;
    }
}

我在没有检查Xcode的情况下编写了它,所以可能会有一些拼写错误,但我展示了主要想法。 在我看来,您不应该在[self checkMark];方法中致电tableView:cellForRowAtIndexPath:

此外,如果您希望一次只有一个选定的单元格,则不应创建NSMutableArray来存储NSIndexPath。您的cellSelected似乎一次存储2个NSIndexPaths,这就是您有这种奇怪行为的原因。