Выбранный UItableViewCell остается синим при выборе - PullRequest
55 голосов
/ 10 мая 2010

Когда я нажимаю на вид после того, как пользователь выбрал строку 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; 
}

Что я делаю не так?

Ответы [ 7 ]

171 голосов
/ 11 мая 2010

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

- (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. Я изменил свой ответ выше, чтобы отразить это.

11 голосов
/ 08 июня 2012

UITableViewController имеет свойство BOOL с именем clearsSelectionOnViewWillAppear, которое делает именно то, что вы хотите.

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

Решение простое. Просто назовите супер-версию viewWillAppear: где-нибудь в вашей версии этого метода:

- (void)viewWillAppear:(BOOL)animated {
  // Your custom code.
  [super viewWillAppear:animated];
}

Apple рекомендует всегда вызывать супер версию любого из методов представления {Сделано, Будет} {A, Disa}, если вы переопределяете их.

Ссылки

7 голосов
/ 10 мая 2010

Вам необходимо отменить выбор:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

4 голосов
/ 22 ноября 2011

Если ваш контроллер основан на 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];
    }
}
3 голосов
/ 10 мая 2010

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

2 голосов
/ 31 марта 2011

Поведение по умолчанию 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
}
0 голосов
/ 10 июня 2011

Другим решением является вызов reITData для UITableView в viewWillAppear

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...