web-dev-qa-db-ja.com

テーブルが再表示されても、UITableViewは選択された行を自動的に選択解除しません。

通常、UITableViewで選択された行は、ユーザーが詳細ビューからポップバックするとアニメーションで選択解除されます。

ただし、UITableViewUIViewControllerが埋め込まれている私の場合は、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];  
}

これはなぜで、どのように修正するのですか?

44
Besi

メインのViewControllerがタイプ ITableViewController からのものである場合、それは a propertyclearsSelectionOnViewWillAppearを持ちます。これはデフォルトでYESであるため、自動的に選択。

このプロパティは ITableView には使用できません。ViewWillAppearメソッドもないためだと思います。

IViewController には元々UITableViewがないため、このプロパティは必要ありません。

結論:UITableViewControllerを使用しない場合は、自分で実装する必要があります。

67
Herm

didSelectRowAtIndexPathの代わりにviewWillAppearで選択解除を行います。

- (void)tableView:(UITableView *)tableView
                  didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
     //show the second view..
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
 }
33
janusfidel

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)
}
23
Kevin R

選択した行の選択を自動的に解除するとは思わない...通常は次のビューに進む前に行う

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    // to do other things
    [self.navigationController pushViewController:yourNextViewController animated:YES];
}
4
Neo

何も問題はありません。強調表示された行の選択を解除すると、常に「手動」になります。 Appleのサンプルコードを見ると、同じことがわかります。

1
nielsbot

In Swift 3/4

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}
0
oscar castellon