UITableViewCells не отменяют выбор при возврате из segue

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

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

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

Ответы

Ответ 1

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

-(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];  
    }
}

Ответ 2

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

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

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
    [self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES];
}

Ответ 3

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

Ответ 4

Для Swift 3

override func viewWillAppear(_ animated: Bool) {

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

        tableView.deselectRow(at: path, animated: true)
    }
}

Ответ 5

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

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)
    if tableView.indexPathForSelectedRow != nil {
        let indexPath: NSIndexPath = tableView.indexPathForSelectedRow!
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    }
}

Ответ 6

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

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

    if let path = tableView.indexPathForSelectedRow {

        tableView.deselectRowAtIndexPath(path, animated: true)
    }
}