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

Выбранный 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; 
}

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

4b9b3361

Ответ 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