2

選択した表のセルにチェックマークを追加すると、他のセルにもチェックが表示されます。

私の didSelectRowAtIndexPathCode は次のとおりです。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    PFObject *player = [squadListArray objectAtIndex:indexPath.row];
    NSString *playerName = [player valueForKey:@"fullName"];
    NSLog(@"%@", playerName);

    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

    selectedCell.accessoryType = UITableViewCellAccessoryCheckmark;
}

NSLog には予期される結果があり、1 つの選択のみが表示されます。

何か案は?他のコードを表示する必要がありますか?

ありがとう

4

5 に答える 5

2

セルが再利用されると、セルをcellForRowAtIndexPath適切に構成できません。データ モデルからセルのすべてのプロパティを常に設定 (およびリセット) する必要があります。


テーブル ビューに行数と各セルの外観を伝えるために使用されるデータ モデルが必要です。その間didSelectRowAtIndexPath、データモデルを情報で更新する必要がありますselected。次に、cellForRowAtIndexPathデータ モデルの情報を使用して、セルにチェックマークが付いているかどうかを判断できます。追加する場合は追加し、そうでない場合は明示的に削除します (セルが再利用された場合にそこに残されるのを防ぐため)。

于 2013-08-09T19:10:43.577 に答える
1

あなたのセルは他の行によってリサイクルされています。メソッドcellforrowatindexpathの最後に、次の行を追加します。

selectedCell.accessoryType = UITableViewCellAccessoryNone;
于 2013-08-09T19:10:46.283 に答える
0

次のことを試すことができます。

  1. 選択したセルのインデックスを保持する NSMutableSet を作成します。

    @property(strong, nonatomic) NSMutableSet *selectedCells;
    
    
    -(NSMutableSet *)selectedCells{
        if(_selectedCells){
            return _selectedCells;
        }
        _selectedCells = [[NSMutableSet alloc]init];
        return _selectedCells;
    }
    
  2. didSelect でセットを更新し、セルを選択します。

        -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
            UITableViewCell *cell =  [tableView cellForRowAtIndexPath:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
            [self.selectedCells addObject:indexPath];
            [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle];
        }
    
  3. didDEselect の indexPath を削除する

    -(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        cell.accessoryType = UITableViewCellAccessoryNone;
        [self.selectedCells removeObject:indexPath];
    }
    
  4. 内部

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

    セルを次のように更新します。

    if([self.selectedCells containsObject:indexPath]){
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else{
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    
于 2014-07-09T14:28:38.383 に答える