2011-12-16 2 views
16

У меня есть UITableView с ячейками в раскадровке и segue, соединяющий ячейки с другим видом.UITableViewCells не отменяет выбор при возврате из segue

Когда вы выбираете ячейку, она отображает анимацию выбора ячейки (превращая ее в серое, в моем случае) и нажимает другое изображение на экран. Но когда вы возвращаетесь к представлению таблицы, анимация отбраковки вообще не отображается (обратная сторона анимации выбора). Поскольку я просто использую segue, я ожидал, что это позаботится по умолчанию.

Есть ли способ заставить его показать анимацию отмены?

+0

Найдено решение здесь: http://stackoverflow.com/вопросы/1840614/почему-делает-UITableView-клетки остаются-подсвечивается. –

ответ

11

Не уверен, что об использовании перетекает, но я часто хочу, чтобы обновить данные, когда появляется контроллер представления. Однако, если вы перезагрузите таблицу, вы очистите строку выбора. Вот некоторый код, который я использую для поддержания выбранной строки и показываю анимацию отмены выбора при возврате. Возможно, это может помочь вам, поэтому я опубликую его здесь.

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    [tableView reloadData]; 
    if(indexPath) { 
     [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    } 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    if(indexPath) { 
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    } 
} 
+0

Я перезаряжаю данные таблицы, но ваше решение не работает. (Я пробовал это раньше, но, конечно, я попробовал еще раз.) –

+0

Вы перезагружаете стол где-то в другом месте? Также убедитесь, что вы не удаляете выбранную строку до вызова viewWillAppear. В зависимости от того, как ваши данные изменяются, повторная выбор одной и той же строки может не сработать для вас. – Chase

+0

Я принял это, хотя я никогда не решал эту проблему. Полагаю, я должен где-то перегружаться. –

22

Это будет обрабатываться автоматически, если ваш контроллер вида был подклассом UITableViewController и clearsSelectedOnViewWillAppear был установлен в YES (что является значением по умолчанию).

В вашем случае вы можете сделать это точно так же, как это делает UITableViewController. Отмените выбор выбранной строки в -viewWillAppear:.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; 
    [self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES]; 
} 
+0

My view controller - это подкласс UITableViewController. Ячейка отменяется, когда она отображается, она просто не отображает анимацию - ее не выбрали для начала. (На всякий случай я попробовал то, что вы предложили, и это не сработало.) –

+0

Просто создал образец проекта с 'UITableViewController' в' UINavigationController', который подталкивает к другому контроллеру представления. Все настроенные с помощью раскадровки с segues и popping контроллер вида отображает анимацию отмены выбора. Возможно, представление исходного контроллера представления выгружается, поэтому состояние выбора таблицы теряется. Это может произойти в ситуациях с высоким давлением в памяти. –

+0

Мое приложение настроено так, как вы описываете (но также с вкладками), и оно использует основные данные. Большинство запросов прямо сейчас - всего две или три записи (для тестирования), поэтому я не думаю, что это будет утечка ресурсов памяти. –

9

Убедитесь, что вы звоните в super Реализации viewWill... и viewDid... методов

+0

Я делаю это в каждом унаследованном методе. –

+0

Как вы возвращаетесь в свой UITableViewController? Вы используете кнопку возврата по умолчанию, которая предоставляется бесплатно, когда вы используете «push» segue в раскадровке? –

+0

Я. Мой UITableViewController находится внутри UINavigationController, и я возвращаюсь к представлению таблицы из подробного представления с помощью кнопки «Назад», создаваемой контроллером навигации. (и segue - это '' push'') –

1

Swift Update: -

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 
    if tableView.indexPathForSelectedRow != nil { 
     let indexPath: NSIndexPath = tableView.indexPathForSelectedRow! 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    } 
} 
1

Лучше Swift обновление:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRowAtIndexPath(path, animated: true) 
    } 
} 
2

Для Swift 3

override func viewWillAppear(_ animated: Bool) { 

    super.viewWillAppear(animated) 
    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRow(at: path, animated: true) 
    } 
} 
Смежные вопросы