2011-12-16 5 views
16

私はストーリーボードにセルを持つUITableViewを持ち、セルを別のビューに接続するセグを持っています。UITableViewCellsは、セグから復帰するときに選択を解除しません。

セルを選択すると、セル選択アニメーションが表示され(私の場合はセル灰色に変わります)、別のビューが画面に表示されます。しかし、テーブルビューに戻ると、選択解除アニメーションはまったく表示されません(選択アニメーションの逆)。私はちょうどセグを使用しているので、私はこれがデフォルトで世話をすることを期待しました。

選択解除アニメーションを強制的に表示する方法はありますか?

+0

見つかりここに解決策:http://stackoverflow.com/questions/1840614/why-does-uitableview-cell-remain-highlighted。 –

答えて

11

わからないviewWill...viewDid...方法のsuper実装を呼び出しているが、私は多くの場合、ビューコントローラが表示されたときにデータをリフレッシュすることを確認してください。ただし、テーブルをリロードすると、選択行がクリアされます。ここでは、選択した行を維持し、復帰時にアニメーションの選択を解除するために使用するコードを示します。これがあなたに役立つ場合がありますので、私はここに掲載します。

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    [tableView reloadData]; 
    if(indexPath) { 
     [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    } 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    if(indexPath) { 
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    } 
} 
+0

私はテーブルのデータをリロードしますが、あなたのソリューションは動作しませんでした。 (前に試してみましたが、もう一度試してみました) –

+0

テーブルを別の場所にリロードしていますか?また、viewWillAppearを呼び出す前に、選択した行を削除しないようにしてください。データの変更方法によっては、同じ行を選択し直すことができない場合があります。 – Chase

+0

私はこの問題を決して解決しなかったが、これを受け入れた。私はどこかにリロードしなければならないと思う。 –

22

ビューコントローラがUITableViewControllerのサブクラスで、がYES(デフォルト値)に設定されている場合、これは自動的に処理されます。

あなたの場合は、UITableViewControllerと同じ方法で行うことができます。選択した行を-viewWillAppear:に選択解除します。

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; 
    [self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES]; 
} 
+0

私のビューコントローラは、UITableViewControllerのサブクラスです。セルが表示されているときは選択解除されていますが、アニメーションは表示されません。最初は選択解除されています。 (ちょっとの場合、あなたが提案したものを試してみましたが、うまくいきませんでした。) –

+0

別のView Controllerにプッシュする 'UINavigationController'に' UITableViewController'を持つサンプルプロジェクトを作成しました。すべてがセグのストーリーボードを使用して設定され、表示コントローラーをポップすると選択解除アニメーションが表示されます。おそらく元のView Controllerのビューがアンロードされているため、テーブルの選択状態は失われています。これは、高いメモリ圧の状況で発生する可能性があります。 –

+0

私のアプリはあなたの説明どおりに設定されていますが(タブもあります)、Core Dataを使用しています。リクエストの大部分は現在(テスト用の)2〜3つのレコードしかないので、メモリリソースがなくなるとは思わないでしょう。 –

9

あなたはseguesの使用について

+0

私はすべての継承メソッドでそれをやっています。 –

+0

どのようにあなたのUITableViewControllerに戻りますか?あなたはストーリーボードで 'プッシュ'セグを使用するときに無料のデフォルトの戻るボタンを使用していますか? –

+0

私は午前。私のUITableViewControllerはUINavigationControllerの中にあり、ナビゲーションコントローラが作成する戻るボタンを使って詳細ビューからtableviewに戻ります。 (そしてsegueは '' push''型です) –

1

スウィフトアップデート: -

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 
    if tableView.indexPathForSelectedRow != nil { 
     let indexPath: NSIndexPath = tableView.indexPathForSelectedRow! 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    } 
} 
1

ベター・スウィフト更新:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRowAtIndexPath(path, animated: true) 
    } 
} 
2

スウィフト3

override func viewWillAppear(_ animated: Bool) { 

    super.viewWillAppear(animated) 
    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRow(at: path, animated: true) 
    } 
} 
関連する問題