3

UITableViewControllerである単純な「お気に入りに追加」機能を作成しています。ユーザーがセルを選択したときに、colorオンを灰色に設定し、無効にしますselectionStyle

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.textLabel.textColor = [UIColor grayColor];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

私の最初の問題は、セルを選択するたびに、他のいくつかのセルも色が切り替わっていることでした。だから私はこれが起こらないようにするために次のコードを削除しました:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

しかし、まだ奇妙な問題があります。テーブルビューを下にスクロールして上部に戻った後、選択したすべてのセルがデフォルトの色に戻り、最後に選択したセルが青色で強調表示されていることに気付きました。

ですから、私は間違っているかもしれませんが、スクロール時にテーブルビューが更新されていると思います。この動作を無効にします。

よろしくお願いします。

4

3 に答える 3

7

UITableViewがサブビュー(UITableViewCells)を表示する方法の基本的な理解が不足しています。UITableViewプログラミングガイドを読むことをお勧めします。テーブルビューで呼び出しを削除しないでください。これはパフォーマンスにとって非常に重要です。dequeueReusableCellWithIdentifier

問題の場合:各セルの状態を追跡し、cellForRowAtIndexPath:で選択の状態を設定する必要があります。UITableViewは可能な限りセルを再利用し、画面上および画面外にスクロールするとセルを更新します。

非常に単純な実装は次のようになります。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (![self.selectedRows containsObject:indexPath])
        [self.selectedRows addObject:indexPath];
    else
        [self.selectedRows removeObject:indexPath];

    [tableView reloadRowsAtIndexPaths:@[indexPath]];
}

およびcellForRow内

if ([self.selectedRows containsObject:indexPath])
{
    cell.textLabel.textColor = [UIColor grayColor];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
else
{
    //set the normal cells values
}
于 2012-09-15T22:33:41.677 に答える
2

UITableViewControllerが提供する最も重要な機能を無効にしたくないのは、この削除/作成のトリックにより、おそらく必要な高速スクロールが可能になるためです。

セルが画面から離れると(tableviewcontrollerの行の高さに応じて)、割り当てが解除されます(メモリから削除されます)。(画面の外側からの)着信セルの場合は、それに応じてcellForRowAtIndexPath(作成)メソッドで作成されます。

DataSource状態の作成と保存にを使用すると、プロパティが失われることはありません。

またはこれを試してください

UITableViewCell *cell = [tableView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];
于 2012-09-15T22:33:18.457 に答える
2

効率を上げるために、セルが画面からスクロールアウトするときにテーブルセルが再利用されます。これは正常であり、望ましいことです。それと一緒に行きなさい、それを打ち負かそうとしないでください。

セル自体以外の場所で選択された行を追跡する必要があります。これは、セルが画面からスクロールアウトすると失われるためです。BOOLであるNSNumberの配列などのプロパティをViewControllerに作成することをお勧めします。セルを選択したら、行に対応してブール値をtrueに設定すると、セルのテキストの色を変更できます。

セルがデキューされるとき、配列に基づいてその色を設定する必要があります。これにより、画面をスクロールしたり画面からスクロールしたりするときに、セルの色が正しくなります。

于 2012-09-15T22:35:14.827 に答える