TableViewCell имеет серый фон после перемещения из видимого tableView - PullRequest
0 голосов
/ 15 октября 2018

В следующем тестовом приложении отображается простой tableView.Свойство selectionStyle ячейки прототипа установлено на default (серый).Поскольку ячеек больше, чем можно отобразить, первые ячейки видны, а последние нет.Цвет фона каждой ячейки установлен на белый.

Первый тест:
Когда выбрана одна из ячеек, ее фон становится серым.В функции делегата ее свойство isSelected устанавливается на false, поэтому фон ячеек снова становится белым.Затем ячейка перемещается в строку 0, и источник данных обновляется соответствующим образом.Это работает, как и ожидалось.

Второй тест:
TableView прокручивается вверх, так что последние ячейки становятся видимыми.Когда ячейка теперь выбрана, она снова перемещается в строку 0, которая была перемещена из видимой области tableView.Это работает снова.Однако:
Если затем просмотр таблицы затем прокрутить вниз, чтобы строка 0 снова стала видимой, перемещенная ячейка теперь имеет серый фон, как если бы она была выбрана , но это не так.Это не работает, как ожидалось:

enter image description here

Вот мой код:

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    var tableData = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", 
                     "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"]
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tableData.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell")!
        let row = indexPath.row
        cell.textLabel?.text = tableData[row]
        cell.backgroundColor = .white
        return cell
    }
}

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedCell = tableView.cellForRow(at: indexPath)!
        selectedCell.isSelected = false

        let sourceRow = indexPath.row
        let destinationRow = 0

        let removedElement = tableData.remove(at: sourceRow)
        tableData.insert(removedElement, at: 0)

        let destinationIndexPath = IndexPath.init(row: destinationRow, section: 0)
        tableView.moveRow(at: indexPath, to: destinationIndexPath)
    }
}

Мой вопрос:
Что-то не так с моим кодом?
Или это ошибка iOS?Если да, есть ли обходной путь?

Обратите внимание:
Конечно, можно использовать tableView.reloadData() вместо tableView.moveRow(at:, to:).Тогда перемещенная ячейка не имеет серого фона.Но в этом случае движение не анимируется, как мне нужно в моем разрабатываемом приложении.
Если для свойства selectionStyle ячейки прототипа установлено значение none, перемещенная ячейка не имеет серого фона, нотогда никто не имеет видимой обратной связи выбора.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я отправил отчет об ошибке в Apple и получил следующий ответ:

Обычно вы должны всегда использовать метод deselectRow (at: animated :) в UITableView, чтобы отменить выбор строки.Если вы измените только выбранное свойство в UITableViewCell, отображаемом в данный момент непосредственно для этой строки, табличное представление не будет уведомлено об этом, и когда новая ячейка будет повторно использована для этой же строки во время прокрутки, табличное представление сбросит выбранное состояниеячейки, чтобы соответствовать ли он считает, что строка выбрана.Состояние табличного представления всегда является источником правды;состояние ячейки - это просто текущее визуальное представление для конкретной строки.

Полезно знать!

0 голосов
/ 15 октября 2018

Вместо установки свойства isSelected вызовите метод deselectRow(at:animated:) для UITableView:

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