Когда я продвигаю представление после того, как пользователь выбрал строку 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;
}
Что я делаю неправильно?
Как указано в ответах выше, вам необходимо явно отменить выбор строки. У вас есть два варианта, как это сделать. Во-первых, отменить выбор строки сразу после выделения:
- (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.Я изменил свой ответ выше, чтобы отразить это.
Вам просто нужно вызвать [tableView deselectRowAtIndexPath: indexPath animated: YES].
Вам нужно снять выделение:
[tableView deselectRowAtIndexPath:indexPath animated:YES];