Почему uitableview ячейки остаются выделенными?



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

801   14  

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, поэтому размотка работала намного лучше.

действия:

  1. напишите раскрутку segue (или вставьте сверху) в свой 1-й VC (тот, с таблицей)
  2. посмотреть 2-й ВК. Управление-перетащите с кнопки Отмена / готово / Etc, которую вы используете, чтобы закрыть этот VC и перетащить на значок выхода вверху.
  3. выберите сегмент размотки, созданный на шаге 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

    Ничего не найдено.