14 ответов:
в своем
didSelectRowAtIndexPathнужно позвонитьdeselectRowAtIndexPath, чтобы отменить выделение ячейки.так что же еще вы делаете в
didSelectRowAtIndexPathвы просто называетеdeselectRowAtIndexPathКак хорошо.- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Do some stuff when the row is selected [tableView deselectRowAtIndexPath:indexPath animated:YES]; }
самый чистый способ сделать это в viewWillAppear:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Unselect the selected row if any NSIndexPath* selection = [self.tableView indexPathForSelectedRow]; if (selection) { [self.tableView deselectRowAtIndexPath:selection animated:YES]; } }таким образом, у вас есть анимация затухания выбора, когда вы возвращаетесь к контроллеру, как и должно быть.
взято из http://forums.macrumors.com/showthread.php?t=577677
Swift версия
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // deselect the selected row if any let selectedRow: IndexPath? = tableView.indexPathForSelectedRow if let selectedRowNotNill = selectedRow { tableView.deselectRow(at: selectedRowNotNill, animated: true) } }
вы подкласс
-(void)viewWillAppear:(BOOL)animated? Выбранный UITableViewCell не отменит выбор, если вы не вызываете[super viewWillAppear:animated];в пользовательский метод.
для пользователей Swift добавьте это в свой код:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: true) }это ответ paulthenerd, за исключением Swift вместо Obj-C.
Swift 3 Решение
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath as IndexPath, animated: true) }
Если вы используете UITableViewCell, то прокомментируйте следующую строку
- (void)setSelected:(BOOL)selected animated:(BOOL)animated { // [super setSelected:selected animated:animated]; }надеюсь, что это помогает.
чтобы получить поведение Kendall Helmstetter Gelner описывает в своем комментарии, вы, вероятно, не хотите deselectRowAtIndexPath, а скорее clearsSelectionOnViewWillAppear свойство на контроллере. Возможно, это было установлено на да случайно?
см. комментарий в шаблоне Apple по умолчанию для новых подклассов UITableViewController:
- (void)viewDidLoad { [super viewDidLoad]; // Uncomment the following line to preserve selection between presentations. // self.clearsSelectionOnViewWillAppear = NO; }
Я получал эту проблему, а также для моего детализации приложения. После того, как viewcontroller, который я буду называть VC, возвращается после нажатия другого ViewController, выбранная ячейка в VC остается выделенной. В моем приложении я создал VC для обработки второго уровня (из трех уровней) моего детализации.
проблема в моем случае заключается в том, что VC был UIViewController (который содержал представление, которое содержало TableView). Вместо этого я сделал VC UITableViewController (который содержал TableView). Класс UITableViewController автоматически обрабатывает снятие подсветки ячейки таблицы после возврата из push. Второй ответ на пост "проблема с deselectRowAtIndexPath в tableView" дает более полный ответ на этот проблема.
проблема не возникла для корневого viewcontroller, потому что когда я создал приложение как "приложение на основе навигации" в XCode, полученный корневой viewcontroller уже был сделан в подкласс UITableViewController.
обновлено с помощью Swift 4
после нескольких экспериментов, также основанных на предыдущих ответах, я пришел к выводу, что лучшее поведение может быть достигнуто двумя способами: (почти идентично на практике)
// First Solution: delegate of the table View func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: false) } // Second Solution: With the life cycle of the view. override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) let selectedRow: IndexPath? = tableView.indexPathForSelectedRow if let selectedRow = selectedRow { tableView.deselectRow(at: selectedRow, animated: false) } }Я лично принимаю первое решение, потому что это просто более лаконично. Еще одна возможность, если вам нужно немного анимации, когда вы вернетесь к своему tableView, это использовать
viewWillAppear:override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let selectedRow: IndexPath? = _view.tableView.indexPathForSelectedRow if let selectedRow = selectedRow { _view.tableView.deselectRow(at: selectedRow, animated: true) } }последнее, но не менее, если вы используя UITableViewController, вы также можете воспользоваться свойством clearsSelectionOnViewWillAppear.
Я использую CoreData, поэтому код, который работал для меня, был комбинацией идей из разных ответов, в Swift:
override func viewDidAppear(_ animated: Bool) { if let testSelected = yourTable.indexPathForSelectedRow { yourTable.deselectRow(at: testSelected, animated: true) } super.viewDidAppear(true) }
У меня была та же проблема в течение длительного времени, так что в случае, если кто-то борется:
взгляните на свой
-tableView: cellForRowAtIndexPath:и посмотрите, создаете ли вы ячейки или используете "идентификатор повторного использования". Если последнее, убедитесь, что ваша таблица В IB имеет ячейку с этим идентификатором. Если вы не используете идентификатор повторного использования, просто создайте новую ячейку для каждой строки.затем это должно дать вашей таблице ожидаемую "исчезающую выбранную строку" при появлении.
используйте этот метод в классе UITableViewCell
- (void)setSelected:(BOOL)selected animated:(BOOL)animated { // Just comment This line of code // [super setSelected:selected animated:animated]; }
Если ни один из них не работает для вас, рассмотрите эту работу:
используйте unwind segue для вызова:
@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) { if let index = tableView.indexPathForSelectedRow { tableView.deselectRowAtIndexPath(index, animated: true) } }почему это? В первую очередь, если у вас возникли проблемы с получением кода отмены выбора для запуска в нужное время. У меня были проблемы с тем, что он не работал на viewWillAppear, поэтому размотка работала намного лучше.
действия:
- напишите раскрутку segue (или вставьте сверху) в свой 1-й VC (тот, с таблицей)
- посмотреть 2-й ВК. Управление-перетащите с кнопки Отмена / готово / Etc, которую вы используете, чтобы закрыть этот VC и перетащить на значок выхода вверху.
выберите сегмент размотки, созданный на шаге 1
удачи.
Для Swift 3: Я бы предпочел его использовать в viewDidDisappear
определить:-
var selectedIndexPath = IndexPath()В viewDidDisappear:-
override func viewDidDisappear(_ animated: Bool) { yourTableView.deselectRow(at: selectedIndexPath, animated: true) }В didSelectRowAtIndexPath:-
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) { selectedIndexPath = indexPath }
Comments