Почему UITableViewCell остается выделенным? - программирование

Почему UITableViewCell остается выделенным?

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

4b9b3361

Ответ 1

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

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 // Do some stuff when the row is selected
 [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Ответ 2

Самый чистый способ сделать это на 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)
    }
}

Ответ 3

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

Ответ 4

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

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

Это paulthenerd ответ, кроме Swift вместо Obj-C.

Ответ 5

Решение Swift 3

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}

Ответ 6

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

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

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

}

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

Ответ 7

Чтобы узнать о поведении Kendall Helmstetter Gelner в своем комментарии, вы, вероятно, не хотите deselectRowAtIndexPath, а скорее свойство clearsSelectionOnViewWillAppear на вашем контроллере. Возможно, это было случайно назначено на ДА?

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
}

Ответ 8

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

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

Проблема не возникла для контроллера корневого представления, поскольку, когда я создал приложение как "приложение на основе навигации" в XCode, результирующий контроллер корневого представления уже был сделан для подкласса UITableViewController.

Ответ 9

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

Ответ 10

Если ни одна из них не работает для вас, подумайте об этом:

Используйте разматывание для вызова:

@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
    if let index = tableView.indexPathForSelectedRow {
        tableView.deselectRowAtIndexPath(index, animated: true)
    }
}

Зачем? Прежде всего, если у вас возникли проблемы с получением кода отмены выбора в нужное время. У меня возникли проблемы с тем, что он не работал над viewWillAppear, так что раскрутка работала намного лучше.

Шаги:

  • Напишите разворот (или вставьте сверху) в 1-й VC (тот, у которого есть таблица)
  • Перейдите во второй VC. Управляйте перетаскиванием с помощью кнопки Cancel/Done/Etc, которую вы используете, чтобы отклонить этот VC и перетащить на значок Exit вверху.
  • Выберите раздел разматывания, созданный на шаге 1

    Удачи.

Ответ 11

Я использую CoreData, поэтому код, который работал у меня, представлял собой комбинацию идей из разных ответов в Swift:

override func viewDidAppear(_ animated: Bool) {
    if let testSelected = yourTable.indexPathForSelectedRow {
        yourTable.deselectRow(at: testSelected, animated: true)
    }
    super.viewDidAppear(true)
}

Ответ 12

У меня была такая же проблема в течение длительного времени, так что если кто-то еще борется:

Взгляните на -tableView: cellForRowAtIndexPath: и посмотрите, создаете ли вы ячейки или используете "идентификатор повторного использования". Если последний, убедитесь, что ваша таблица в IB имеет ячейку с этим идентификатором. Если вы не используете повторное использование Идентификатор, просто создайте новую ячейку для каждой строки.

Это должно затем дать вашей таблице ожидаемую "выцветать выбранную строку" при появлении.

Ответ 13

Использовать этот метод в классе UITableViewCell

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

   // Just comment This line of code
   // [super setSelected:selected animated:animated];        
}

Ответ 14

Для Swift 3: Я бы предпочел использовать его в viewDidDisappear

Определить: -

    var selectedIndexPath = IndexPath()

В представленииDidDisappear: -

    override func viewDidDisappear(_ animated: Bool) {
    yourTableView.deselectRow(at: selectedIndexPath, animated: true)
}

В didSelectRowAtIndexPath: -

    func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
    selectedIndexPath = indexPath
}

Ответ 15

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}

Ответ 16

если ячейка остается выделенной после прикосновения к ней, вы можете вызвать метод UITabelView,

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

'[tableView deselectRowAtIndexPath:indexPath animated:YES];'   

}

Или вы можете использовать следующий метод и изменить его в соответствии с вашими требованиями,

//MARK: UITableViewDelegate

func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
     cell.backgroundColor = UIColor.greenColor()
  }
}

func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
     cell.backgroundColor = UIColor.blackColor()
  }
}