Подтвердить что ты не робот

UITableView автоматически не отменяет выбранную строку, когда таблица снова появляется

Обычно выбранная строка в 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];  
}

Почему это и как его исправить?

4b9b3361

Ответ 1

Когда ваш основной ViewController имеет тип UITableViewController, он имеет свойство clearsSelectionOnViewWillAppear, которое по умолчанию YES - поэтому он автоматически очистит выделение.

Это свойство недоступно для UITableView, я предполагаю, что он не имеет метода ViewWillAppear.

A UIViewController не нуждается в этом свойстве, поскольку оно не имеет UITableView изначально.

вывод: вам придется реализовать его самостоятельно, если вы не используете UITableViewController.

Ответ 2

Сделайте отменить выбор в didSelectRowAtIndexPath вместо viewWillAppear:

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

Ответ 3

В быстром, вы можете добавить следующие строки в viewWillAppear

if let row = tableView.indexPathForSelectedRow() {
    self.tableView.deselectRowAtIndexPath(row, animated: false)
}

В swift 2, без скобок:

if let row = tableView.indexPathForSelectedRow {
    self.tableView.deselectRowAtIndexPath(row, animated: false)
}

Ответ 4

Я не думаю, что снятие выделения выбранной строки происходит автоматически... Обычно я делаю это, прежде чем перейти к следующему представлению

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

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

Ответ 5

В Swift 3/4

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

Ответ 6

Ничего не так - отмена выделенного ряда всегда "ручная". Если вы посмотрите пример кода Apple, вы увидите то же самое.