如何在Swift中选择和取消选择多个TableView单元格

41ik7eoe  于 2023-03-22  发布在  Swift
关注(0)|答案(3)|浏览(146)

我需要选择多个tableview单元格,如果我再次单击,那么它应该取消选择。所以尝试下面的代码,但得到错误
如何附加选定的行arrSelectedRowsBuy,当再次点击,然后如何从arrSelectedRowsBuy取消选择该单元格。请指导我

var arrSelectedRowsBuy:[Int] = []
var selectedIndexes : Set<Int> = []

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

if selectedIndexes.contains(indexPath.row) {
    self.arrSelectedRowsBuy.remove(at: eventListData?.result?.events?[indexPath.row].id ?? 0)
    print("removed array \(arrSelectedRowsBuy)")
}
else {
    self.arrSelectedRowsBuy.append(eventListData?.result?.events?[indexPath.row].id ?? 0)
    print("added array \(arrSelectedRowsBuy)")
}
}

现在我不能删除取消选定的细胞id从arrSelectedRowsBuy如果我点击第二次然后id添加第二次.如果我点击第二次如何删除添加的行
加法数组[1,3,3,2,2]

5lwkijsr

5lwkijsr1#

你可以取一组selectedIndexes

var selectedIndexes : Set<Int> = []

然后在didselect方法中每次检查selectedIndexes是否包含当前indexPaht.row。如果包含,则取消选择并将其从selectedIndexes集中移除,否则选择它并将其插入selectedIndexes

kxeu7u2r

kxeu7u2r2#

你不需要自己处理多个选择。UITableView有一个allowsMultipleSelection属性:https://developer.apple.com/documentation/uikit/uitableview/1614938-allowsmultipleselection
当行被选中或取消选中时,你会收到单独的委托回调。你的代码也会跟踪一些模型对象标识符,你可以在select/disexecute委托方法中继续这样做,或者只是向表视图请求indexPathsForSelectedRowshttps://developer.apple.com/documentation/uikit/uitableview/1614864-indexpathsforselectedrows
如果你确实想保持一个最新的模型标识符数组,你需要修改你的代码。你在数组的末尾插入一个标识符,但在数组中的位置删除一个标识符。这将删 debugging 误的项,或者当你试图删除一个比数组中的项数高的行索引时,它会崩溃。这可能值得一个单独的问题。

b09cbbtk

b09cbbtk3#

您正在使用if selectedIndexes.contains(indexPath.row) { ... }检查selectedIndexes是否包含所选项目的索引,但您没有在任何地方使用实际索引更新selectedIndexes。因此,if条件总是失败,并且else块将被执行。
试试这个:

if selectedIndexes.contains(indexPath.row) {
    self.arrSelectedRowsBuy.remove(at: eventListData?.result?.events?[indexPath.row].id ?? 0)
    // Add this
    if let index = selectedIndexes.firstIndex(of: indexPath.row) {
        selectedIndexes.remove(at: index)
    }
} else {
    self.arrSelectedRowsBuy.append(eventListData?.result?.events?[indexPath.row].id ?? 0)
    // Add this
    selectedIndexes.append(indexPath.row)
}

相关问题