50

通常、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];  
}

これはなぜですか、そしてそれを修正する方法は?

4

7 に答える 7

77

メインの ViewController がUITableViewController型の場合、デフォルトのプロパティ があるため、選択が自動的にクリアされます。clearsSelectionOnViewWillAppearYES

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

UIViewControllerはもともとこのプロパティを持っていないため、このプロパティは必要ありませんUITableView

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

于 2012-08-24T09:14:16.653 に答える
35

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

- (void)tableView:(UITableView *)tableView
                  didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
     //show the second view..
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
 }
于 2012-08-24T09:40:06.067 に答える
27

迅速に、次の行をviewWillAppear

if let indexPath = tableView.indexPathForSelectedRow() {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

Swift 2 では、括弧なしです。

if let indexPath = tableView.indexPathForSelectedRow {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

Swift 4 (および 3?) では、関数名がクリーンアップされました。

if let indexPath = tableView.indexPathForSelectedRow {
    tableView.deselectRow(at: indexPath, animated: true)
}
于 2015-06-23T13:28:41.000 に答える
4

選択した行の選択解除が自動的に行われるとは思いません...通常、次のビューにプッシュする前に行います

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

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    // to do other things
    [self.navigationController pushViewController:yourNextViewController animated:YES];
}
于 2012-08-24T09:02:02.240 に答える
1

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

于 2012-08-24T08:52:07.240 に答える