Выбранный UItableViewCell, остающийся синим при выборе

Когда я продвигаю представление после того, как пользователь выбрал строку UITableView, строка получает синее выделение, и затем новое представление появляется. Это прекрасно. Но когда я иду 'назад', строка все еще выделяется в синем. Вот мой код didSelectRowAtIndexPath.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SettingsViewController *controller = [[SettingsViewController alloc] initWithNibName:@"SettingsView" bundle:nil];
    [[self navigationController] pushViewController:controller animated:YES];
    [controller release], controller = nil; 
}

Что я делаю неправильно?

55
задан cannyboy 10 May 2010 в 13:48
поделиться

3 ответа

Как указано в ответах выше, вам необходимо явно отменить выбор строки. У вас есть два варианта, как это сделать. Во-первых, отменить выбор строки сразу после выделения:

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

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

Это имеет небольшое преимущество в том, что пользователь видит проблеск своего предыдущего выбора, когда он возвращается, чтобы он мог видеть то, что он выбрал ранее.

Чтобы реализовать это, вам просто нужно переопределить viewWillAppear :

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

Как я уже сказал, это то, что используется по умолчанию для реализации UITableViewController viewWillAppear: делает это, если вы используете UITableViewController и , но не , наблюдая такое поведение, вы должны убедиться, что вызываете реализацию super в собственном классе viewDidAppear: .

Обновление (30 октября 2013 г.) : хорошо, это популярный ответ! Как справедливо указывает Бен в комментариях, UITableViewController фактически делает это в viewWillAppear: не viewDidAppear: - это правильный выбор времени. Кроме того, вы включаете и выключаете это поведение с помощью свойства clearsSelectionOnViewWillAppear UITableViewController.Я изменил свой ответ выше, чтобы отразить это.

171
ответ дан 26 November 2019 в 17:37
поделиться

Вам просто нужно вызвать [tableView deselectRowAtIndexPath: indexPath animated: YES].

3
ответ дан 26 November 2019 в 17:37
поделиться

Вам нужно снять выделение:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

7
ответ дан 26 November 2019 в 17:37
поделиться