Несколько checkMark, когда строка выбрана в UITableView IOS

У меня есть 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 [email protected]"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;

    }


}

Ответ 1

[self.tableView cellForRowAtIndexPath:indexPath] вызов в 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];
}

Ответ 2

Просто используйте методы didSelectRowAtIndexPath и didDeselectRowAtIndexPath и ваш экземпляр контроллера табличного представления.

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

    [[self.tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];
}

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

    [[self.tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryNone];
}

Ответ 3

Попробуйте следующее:

Объявите в своем .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 за раз, поэтому у вас такое странное поведение.