В следующем тестовом приложении отображается простой tableView.Свойство selectionStyle
ячейки прототипа установлено на default
(серый).Поскольку ячеек больше, чем можно отобразить, первые ячейки видны, а последние нет.Цвет фона каждой ячейки установлен на белый.
Первый тест:
Когда выбрана одна из ячеек, ее фон становится серым.В функции делегата ее свойство isSelected
устанавливается на false
, поэтому фон ячеек снова становится белым.Затем ячейка перемещается в строку 0, и источник данных обновляется соответствующим образом.Это работает, как и ожидалось.
Второй тест:
TableView прокручивается вверх, так что последние ячейки становятся видимыми.Когда ячейка теперь выбрана, она снова перемещается в строку 0, которая была перемещена из видимой области tableView.Это работает снова.Однако:
Если затем просмотр таблицы затем прокрутить вниз, чтобы строка 0 снова стала видимой, перемещенная ячейка теперь имеет серый фон, как если бы она была выбрана , но это не так.Это не работает, как ожидалось:
![enter image description here](https://i.stack.imgur.com/3z1ly.png)
Вот мой код:
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
, перемещенная ячейка не имеет серого фона, нотогда никто не имеет видимой обратной связи выбора.