ストーリーボードにセルを含むUITableViewがあり、セルを別のビューに接続するセグエがあります。
セルを選択すると、セル選択アニメーションが表示され(私の場合はセルが灰色になります)、もう一方のビューが画面に表示されます。ただし、テーブルビューに戻ると、選択解除アニメーションはまったく表示されません(選択アニメーションの逆)。私はセグエを使用しているだけなので、デフォルトでこれが処理されることを期待していました。
選択解除アニメーションを表示するように強制する方法はありますか?
ストーリーボードにセルを含むUITableViewがあり、セルを別のビューに接続するセグエがあります。
セルを選択すると、セル選択アニメーションが表示され(私の場合はセルが灰色になります)、もう一方のビューが画面に表示されます。ただし、テーブルビューに戻ると、選択解除アニメーションはまったく表示されません(選択アニメーションの逆)。私はセグエを使用しているだけなので、デフォルトでこれが処理されることを期待していました。
選択解除アニメーションを表示するように強制する方法はありますか?
ビューコントローラがのサブクラスでUITableViewController
あり、(デフォルト値)clearsSelectedOnViewWillAppear
に設定されている場合、これは自動的に処理されます。YES
あなたの場合、これはそれとまったく同じ方法で行うことができますUITableViewController
。で選択した行の選択を解除し-viewWillAppear:
ます。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
[self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES];
}
およびメソッドのsuper
実装を呼び出していることを確認してくださいviewWill...
viewDid...
セグエの使用についてはよくわかりませんが、ViewControllerが表示されたときにデータを更新したいことがよくあります。ただし、テーブルをリロードすると、選択した行がクリアされます。これは、選択した行を維持し、戻ったときに選択解除アニメーションを表示するために使用するコードです。これがあなたを助けるかもしれないという場合があるので、私はそれをここに投稿します。
-(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];
}
}
Swift3の場合
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let path = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: path, animated: true)
}
}
スウィフトアップデート:-
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
if tableView.indexPathForSelectedRow != nil {
let indexPath: NSIndexPath = tableView.indexPathForSelectedRow!
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
}
より良いSwiftアップデート:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if let path = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(path, animated: true)
}
}