2011-06-24 5 views
2

私は、選択したときにviewControllersをスタックにプッシュするセルを持つUITableViewを持っています。子viewControllerはユーザー入力を受け取り、スタックからポップします。viewWillAppearでreloadDataとdeselectRowAtIndexPathを呼び出すことができないのはなぜですか?同時にアニメーション化されますか?

子viewControllerがポップされると、親tableViewで選択したセルの値を更新し、その行を選択解除します。 reloadDataを使用してセルを更新することができ、deselectRowAtIndexPath - を使用して行の選択を解除できますが、同時に両方を実行することはできません。

これはなぜreloadDataが暗黙的にセルの選択を解除し、deselectRowAtIndexPathが明示的に選択を解除するのか分かりますが、同じリロード/選択解除動作を達成したい人が見つからないことが不思議です。私はここで何が欠けていますか?

すべてのコードはviewWillAppear:animated - viewWillAppearでdeselectRowAtIndexPathを入れ、viewDidAppearでreloadDataを置くと閉じることができますが、これは私が望むものではありません。

答えて

8

セルをリロードすると、セルが自動的に選択解除されます。これは、セルのselectedプロパティをYESに設定していないためです。tableView:cellForRowAtIndexPath:です。だからあなたはこれを別に扱わなければならないでしょう。 indexPathのセルがselectedである必要があることを確認し、適切にselectedプロパティをYESに設定してtableView:cellForRowAtIndexPath:に設定するか、データをリロードした後にセルを選択します。このような場合には、次の方法を実行することができる -

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationNone]; 

[self.tableView selectRowAtIndexPath:indexPath 
          animated:NO 
         scrollPosition:UITableViewScrollPositionNone]; 

[self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 

ステップの順序は次のとおり -

  1. 任意アニメーションせずに行をリロード。
  2. アニメーションなしの行を選択します。
  3. アニメーションを含む行の選択を解除します。

この方法で、あなたはあなたが望む効果を得ることができると思います。

+0

Deepakさん、ありがとうございました。私も同様に尋ねられた2分後に答えました。スタックオーバーフローのルール! :) –

0

編集可能なView Controllerを初めてロードするときにユーザーがその行をタップすると、編集可能なViewControllerをロードする前にUITableViewCellの選択を解除します。

関連する問題