UITableViewCells не отменяет выбор при возвращении из перехода - PullRequest
18 голосов
/ 16 декабря 2011

У меня есть UITableView с ячейками в раскадровке и переход, соединяющий ячейки с другим представлением.

Когда вы выбираете ячейку, она отображает анимацию выбора ячейки (в моем случае она становится серой) и выводит другой вид на экран. Но когда вы возвращаетесь к табличному виду, анимация отмены выбора вообще не отображается (обратная анимация выделения). Поскольку я просто использую segue, я ожидал, что об этом по умолчанию позаботятся.

Есть ли способ заставить его показать анимацию отмены выбора?

Ответы [ 6 ]

23 голосов
/ 16 декабря 2011

Это будет обрабатываться автоматически, если контроллер представления был подклассом UITableViewController, а clearsSelectedOnViewWillAppear был установлен на YES (что является значением по умолчанию).

В вашем случае вы можете сделать это точно так же, как UITableViewController. Отмените выделение выбранной строки в -viewWillAppear:.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
    [self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES];
}
11 голосов
/ 28 декабря 2011

Не уверен насчет использования сегментов, но я часто хочу обновить данные, когда появляется контроллер представления. Однако, если вы перезагрузите таблицу, вы очистите строку выбора. Вот некоторый код, который я использую для поддержания выбранной строки и отображения отмены выбора анимации при возврате. Возможно, это поможет вам, поэтому я опубликую это здесь.

-(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];  
    }
}
9 голосов
/ 27 декабря 2011

Убедитесь, что вы вызываете super реализации viewWill... и viewDid... методов

3 голосов
/ 18 мая 2017

для Swift 3

override func viewWillAppear(_ animated: Bool) {

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

        tableView.deselectRow(at: path, animated: true)
    }
}
1 голос
/ 02 февраля 2016

Better Swift обновление:

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

    if let path = tableView.indexPathForSelectedRow {

        tableView.deselectRowAtIndexPath(path, animated: true)
    }
}
1 голос
/ 12 октября 2015

Быстрое обновление: -

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)
    if tableView.indexPathForSelectedRow != nil {
        let indexPath: NSIndexPath = tableView.indexPathForSelectedRow!
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...