1

最新のアプリでチェックリストを作成するときに問題が発生しました。

を呼び出すと、CustomCelldidSelectRowAtIndexPathのが変更されます。imageViewそのため、テーブルの行をクリックすると、CustomCell画像がチェックマークに切り替わります。正常に動作しますが、下にスクロールすると、チェックリストの他の行もいくつか設定されていることに気付きます。行#1をタッチすると、1、11、21、31、41などが更新されることがわかりました。

行#1の画像を変更するだけでどうすればよいですか?IndexPathはどういうわけか10で最大になりますか?

ありがとう!!

didSelectRowAtIndexPathコード:

{
    CustomCell *cell = (CustomCell *) [resultsTable cellForRowAtIndexPath:indexPath];
    cell.puckSelect.image = [UIImage imageNamed:@"puck_c.png"];
    [cell setNeedsDisplay]
}

私のリストには何千ものアイテムがありますが、それはこれに影響を与えていますか?

4

3 に答える 3

2

これは、リストをスクロールするときにセルが再利用されるためです。セルに状態を保存しないでください (つまり、どのセルが選択されているか)。常にデータ構造 (NSArray など) からセルの状態を読み取ります。

私がする傾向があるのはこれです:

  • didSelectRowAtIndexPath で、データ構造を変更します (たとえば、行 23 の「isSelected」を YES に設定します)。
  • 次に reloadRowsAtIndexPaths を使用して、テーブルにこの行を強制的にリロードさせます
  • cellForRowAtIndexPath で、データ構造から読み取り、この行にティックがあるかどうかを判断します。
于 2013-03-06T16:21:02.933 に答える
1

細胞の再利用が行われています。状態を変更したい場合、セル自体を更新することはできません。iOS は、セルが画面外になるとセルをリサイクルし、別の行で再利用するためです。どの行がチェックされているかを何らかの方法で記録し、 で表示するセルが準備されたら、-tableView:cellForRowAtIndexPathの値をpuckSelect.image適切に設定する必要があります。

于 2013-03-06T16:20:40.903 に答える
0

didSelectRowAtIndexPathでデータソースを変更するか、cellForRowAtIndexPathでチェックするプロパティの値を設定できます。このようなもの:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = [self.theData objectAtIndex:indexPath.row];
    if (indexPath.row == self.checkedIndexPath.row) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else{
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    self.checkedIndexPath = indexPath;
    [tableView reloadData];
}
于 2013-03-06T16:25:32.157 に答える