通常、UITableView
で選択された行は、ユーザーが詳細ビューからポップバックするとアニメーションで選択解除されます。
ただし、UITableView
にUIViewController
が埋め込まれている私の場合は、viewWillAppear
で手動で行う必要があります。
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// For some reason the tableview does not do it automatically
[self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow
animated:YES];
}
これはなぜで、どのように修正するのですか?
メインのViewControllerがタイプ ITableViewController からのものである場合、それは a propertyclearsSelectionOnViewWillAppear
を持ちます。これはデフォルトでYES
であるため、自動的に選択。
このプロパティは ITableView には使用できません。ViewWillAppear
メソッドもないためだと思います。
IViewController には元々UITableView
がないため、このプロパティは必要ありません。
結論:UITableViewController
を使用しない場合は、自分で実装する必要があります。
didSelectRowAtIndexPath
の代わりにviewWillAppear
で選択解除を行います。
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//show the second view..
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
Swiftでは、viewWillAppear
に次の行を追加できます
if let row = tableView.indexPathForSelectedRow() {
tableView.deselectRowAtIndexPath(row, animated: true)
}
Swift 2の場合、括弧なしです:
if let row = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(row, animated: true)
}
Swift 4(および3?))では、関数名がクリーンアップされました。
if let indexPath = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: indexPath, animated: true)
}
選択した行の選択を自動的に解除するとは思わない...通常は次のビューに進む前に行う
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
// to do other things
[self.navigationController pushViewController:yourNextViewController animated:YES];
}
何も問題はありません。強調表示された行の選択を解除すると、常に「手動」になります。 Appleのサンプルコードを見ると、同じことがわかります。
In Swift 3/4
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}