我正在制作一个音乐流派选择应用程序,当我去我的表选择流派时,我选择一行,它从我的选择中随机选择大约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个单元格左右检查一次看似随机的单元格的问题(这不是随机的,只是带有复选标记的单元格正在被重用)。

10-08 02:42