it-swarm.com.ru

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

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

41
Besi

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

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

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

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

64
Herm

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

- (void)tableView:(UITableView *)tableView
                  didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
     //show the second view..
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
 }
31
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)
}
21
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

В Свифт 3/4

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