web-dev-qa-db-ja.com

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 =@"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;

    }


}
15
Klinkert0728

[self.tableView cellForRowAtIndexPath:indexPath]didSelectRowAtIndexPathを呼び出すと、正確なセルは返されません。同じセルでも、新しいセルでも、再利用されたセルでもかまいません。アクセサリビューで再利用されたセルにチェックマークが付いている場合、チェックマークの付いたセルが2つあります。

配列に格納し、それに応じて使用することをお勧めします。複数の選択肢がある場合は、以下のコード例を使用してください。

- (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];
}
41
Naveen Prasad R

これを試して:

.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: 方法。

さらに、一度に1つのセルのみを選択する場合は、NSMutableArrayを作成してNSIndexPathを格納しないでください。あなたのcellSelectedは一度に2 NSIndexPathsを格納しているようです。そのため、この奇妙な振る舞いをしています。

4
Neru