ホーム > 開発 > UITableViewに戻った時に確実に行のハイライト解除アニメーションを表示する

UITableViewに戻った時に確実に行のハイライト解除アニメーションを表示する

UITableViewの行はタッチした時にハイライトしますが、ハイライトの解除はそこからビューが遷移した先から戻った時に、遅れて行います。
これはviewWillAppear:でindexPathForSelectedRowから取得したハイライトされている行を、deselectRowAtIndexPath:animated:で解除するだけの事なんですが、上手くいく場合と上手くいかない場合があります。
上手くいかない場合は、テーブルをリロードしてしまっている時です。
この場合選択状態が失われてしまうので、最初からハイライトが消えていて解除アニメーションがでません。
詳細表示側で行が増減してしまった場合や、内容を更新してしまった場合がこの状況に該当します。

そこで対処ですが、次のように処理する事で可能です。

  1. テーブルをリロードする。
  2. テーブルのデータソースを検索して、直前に詳細ビューで表示していた行を特定する。
  3. 特定した行を、逆にselectRowAtIndexPath:animated:scrollPosition:でハイライトする。

この処理は直感に反しますが、上手く動きます。

テーブル全体のリロードを避けて、行の増減を実行したり、更新された行だけを更新する事でも回避が可能かもしれませんが、手間が相当になると思います。
また、メモリワーニングでビューがリロードされている場合は、テーブル全体のリロードが回避不能です。

コードは次のようになると思います。

- (void)viewWillAppear:(BOOL)animated {
    [self.tableView reloadData];

    if (detailViewController.data) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[datas indexOfObject:detailViewController.data] inSection:0];
        [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    }
    [super viewWillAppear:animated];
}
広告
カテゴリー:開発 タグ: ,
  1. nekot
    2009年8月3日08:21

    非常に参考になりました。
    テーブルのリロードを行うことでやりたいことが実現できました。
    ありがとうございました。

  1. 2009年10月11日01:20

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。