Почему UITableViewCell остается выделенным? - PullRequest
138 голосов
/ 03 декабря 2009

Что может вызвать выделение ячейки табличного представления после прикосновения? Я щелкаю ячейку и вижу, что она остается подсвеченной, когда отображается подробный вид. После появления подробного представления ячейка все еще подсвечивается.

Ответы [ 17 ]

251 голосов
/ 03 декабря 2009

В вашем didSelectRowAtIndexPath вам нужно позвонить deselectRowAtIndexPath, чтобы отменить выбор ячейки.

Так что, что бы вы ни делали в didSelectRowAtIndexPath, у вас просто есть вызов deselectRowAtIndexPath.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 // Do some stuff when the row is selected
 [tableView deselectRowAtIndexPath:indexPath animated:YES];
}
58 голосов
/ 03 октября 2012

Самый чистый способ сделать это на 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)
    }
}
20 голосов
/ 08 января 2010

Вы подкласс -(void)viewWillAppear:(BOOL)animated? Выбранный UITableViewCell не будет отменен, если вы не вызываете [super viewWillAppear:animated]; в своем пользовательском методе.

17 голосов
/ 18 марта 2016

Для пользователей Swift добавьте это в свой код:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

Это ответ Paulthenerd, за исключением Swift вместо Obj-C.

9 голосов
/ 28 февраля 2017

Решение Swift 3

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
7 голосов
/ 22 марта 2012

Если вы используете UITableViewCell, прокомментируйте следующую строку

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{

 // [super setSelected:selected animated:animated];

}

Надеюсь, это поможет.

4 голосов
/ 23 марта 2018

Обновлено с 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 .

3 голосов
/ 15 марта 2012

Чтобы получить поведение, которое Кендалл Хелмстеттер Гелнер описывает в своем комментарии, вам, скорее всего, не нужен deselectRowAtIndexPath, а скорее свойство clearsSelectionOnViewWillAppear на контроллере. Возможно, это было установлено в ДА случайно?

См. Комментарий в шаблоне Apple по умолчанию для новых подклассов UITableViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
}
2 голосов
/ 16 августа 2011

Эта проблема возникла и у меня в приложении для детализации. После того, как viewcontroller, который я назову VC, возвращается после нажатия другого ViewController, выбранная ячейка в VC остается выделенной. В моем приложении я создал VC для обработки второго (из трех уровней) уровня детализации.

Проблема в моем случае заключается в том, что VC был UIViewController (который содержал View, который содержал TableView). Вместо этого я сделал VC UITableViewController (который содержит TableView). Класс UITableViewController автоматически обрабатывает отмену выделения ячейки таблицы после возврата из толчка. Второй ответ на пост « Проблема с deselectRowAtIndexPath в tableView » дает более полный ответ на эту проблему.

Проблема не возникла для корневого viewcontroller, потому что когда я создавал приложение как «Приложение на основе навигации» в XCode, полученный корневой viewcontroller уже был создан для подкласса UITableViewController.

1 голос
/ 04 февраля 2019
 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...