Выбранный 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;
}
Что я делаю неправильно?
Ответы
Ответ 1
Как следует из вышеприведенных ответов, вам нужно явно отменить выбор строки. У вас есть два варианта, как вы это делаете. Во-первых, следует отменить выборку сразу после выбора:
- (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
в своем class <собственный > viewDidAppear:
.
Обновление (30 октября 2013): хорошо, это популярный ответ! Как справедливо отмечает Бен в комментариях, UITableViewController фактически делает это в viewWillAppear:
not viewDidAppear:
- это правильное время. Кроме того, вы включаете и выключаете это поведение с помощью свойства clearsSelectionOnViewWillAppear
UITableViewController. Я изменил свой ответ выше, чтобы отразить это.
Ответ 2
UITableViewController
имеет свойство BOOL, называемое clearsSelectionOnViewWillAppear
, которое делает именно то, что вы хотите.
По умолчанию установлено значение YES
, но я заметил, что вы можете (иногда случайно) отключить это свойство, реализовав свой собственный метод viewWillAppear:
. Я думаю, это связано с тем, что отключение происходит во время [UITableViewController viewWillAppear:]
, которое никогда не получится вызвано, если вы его переопределите.
Решение легко. Просто позвоните в супер версию viewWillAppear:
где-нибудь в вашей версии этого метода:
- (void)viewWillAppear:(BOOL)animated {
// Your custom code.
[super viewWillAppear:animated];
}
Apple рекомендует всегда ссылаться на супер-версию любого из методов {Did, Will} {A, Disa} ppear, если вы их переопределите.
Ссылки
Ответ 3
Вам нужно отменить выбор:
[tableView deselectRowAtIndexPath:indexPath animated:YES];
Ответ 4
Если ваш контроллер основан на UITableViewController
, вы получаете эту функцию бесплатно. Но я часто заканчивал тем, что использовал UIViewController
, нет. других элементов управления в дополнение к UITableView
, в этом случае вы должны переопределить viewWillAppear
на
-(void) viewWillAppear:(BOOL)animated{
// Unselect the selected row if any
NSIndexPath* selection = [devListTableview indexPathForSelectedRow];
if (selection){
[tableview deselectRowAtIndexPath:selection animated:YES];
}
}
Ответ 5
Вам просто нужно вызвать [tableView deselectRowAtIndexPath: indexPath анимированный: YES].
Ответ 6
Поведение UITableViewController
по умолчанию отменяет выбор строки, когда пользователь возвращается из подробного представления. Ответ, данный Люком, прекрасен, но я хочу указать причину этого:
1- Если у вас есть UITableViewController
, как это было, когда вы создали его с нуля, у вас будет все поведение по умолчанию.
2- Если в ситуации 1 вы добавите -viewWillAppear
или -viewDidAppear
, то вы будете перезаписывать стандартное поведение. Их, если вы хотите, чтобы строка отменила выбор при возврате, вы должны явно указать super
, что вы хотите, чтобы он отменил выбор строки, как всегда! Чтобы достичь этого, как говорит Люк, вы должны называть [super viewWillAppear:animated]
или [super viewDidAppear:animated]
следующим образом:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Here goes all of your stuff
}
Ответ 7
Еще одно решение - вызвать UITableView reloadData в viewWillAppear