我正在制作一个音乐流派选择应用程序,当我去我的表选择流派时,我选择一行,它从我的选择中随机选择大约10行。
我的选择代码是:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let genresFromLibrary = genrequery.collections
let rowitem = genresFromLibrary![indexPath.row].representativeItem
print(rowitem?.value(forProperty: MPMediaItemPropertyGenre) as! String
)
if let cell = tableView.cellForRow(at: indexPath)
{
cell.accessoryType = .checkmark
}
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath)
{
cell.accessoryType = .none
}
}
最佳答案
调用cellForRowAtIndexPath
时,默认情况下会重用单元格。如果不跟踪选定的索引路径,则会导致单元格中的数据错误。您需要跟踪当前选定的索引路径,以便在表视图中显示适当的附件类型。
一种方法是在UITableViewController中有一个属性,它只存储所选单元格的索引路径。它可以是数组或集合。
var selectedIndexPaths = Set<IndexPath>()
选择
didSelectRowAt
上的行时,根据索引路径是否已在数组中,添加或删除selectedIndexPaths
中的单元格:override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if selectedIndexPaths.contains(indexPath) {
// The index path is already in the array, so remove it.
selectedIndexPaths.remove(indexPathIndex)
} else {
// The index path is not part of the array
selectedIndexPaths.append(indexPath)
}
// Show the changes in the selected cell (otherwise you wouldn't see the checkmark or lack thereof until cellForRowAt got called again for this cell).
tableView.reloadRows(at: [indexPath], with: .none)
}
一旦完成,在
cellForRowAtIndexPath
上,检查indexPath是否在selectedIndexPaths
数组中以选择accessoryType
。if selectedIndexPaths.contains(indexPath) {
// Cell is selected
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
这应该可以解决每隔10个单元格左右检查一次看似随机的单元格的问题(这不是随机的,只是带有复选标记的单元格正在被重用)。