Ios Swift-在tableview的多个部分上处理自定义复选标记按钮状态
我有一个具有多个部分的tableview,每个部分有3个单元格,每个单元格包含自定义复选标记按钮。在这里,用户可以在单击时更改选中和取消选中复选按钮的图像。 问题是,当用户点击按钮时,我将单元格按钮图像从取消选中改为选中,这样可以正常工作。如果我滚动tableview,复选标记图像添加到错误的单元格 我在谷歌上搜索了一下,找到了这样的解决方案:在数组中保存单击的单元格indexath.row,并在用户再次单击同一单元格时从数组中删除。 它不工作,因为我有多个部分 请给我任何建议,找出解决我问题的办法Ios Swift-在tableview的多个部分上处理自定义复选标记按钮状态,ios,iphone,swift3,Ios,Iphone,Swift3,我有一个具有多个部分的tableview,每个部分有3个单元格,每个单元格包含自定义复选标记按钮。在这里,用户可以在单击时更改选中和取消选中复选按钮的图像。 问题是,当用户点击按钮时,我将单元格按钮图像从取消选中改为选中,这样可以正常工作。如果我滚动tableview,复选标记图像添加到错误的单元格 我在谷歌上搜索了一下,找到了这样的解决方案:在数组中保存单击的单元格indexath.row,并在用户再次单击同一单元格时从数组中删除。 它不工作,因为我有多个部分 请给我任何建议,找出解决我问题的
// Button action.
func buttonTappedOnCell(cell: customeCell) {
let indexPath : IndexPath = self.tableView.indexPath(for: cell)!
if self.selectedIndexPath.count > 0 {
for selectedIndex in self.selectedIndexPath {
if selectedIndex as! IndexPath == indexPath {
self.selectedIndexPath.remove(indexPath)
} else {
self.selectedIndexPath.add(indexPath)
}
}
} else {
self.selectedIndexPath.add(indexPath)
}
cellForRowAtIndexPath中的代码
for anIndex in self.selectedIndexPath {
if anIndex as! IndexPath == indexPath {
cell.checkMarkButton.setBackgroundImage(UIImage(named: "checkMark"), for: .normal)
} else {
cell.checkMarkButton.setBackgroundImage(UIImage(named: "UnCheckMark"), for: .normal)
}
}
在您的TableView中,刚才放置的DidSelect方法
let cell = tableView.cellForRowAtIndex(indexPath).accessoryType = UITableViewCell.accessoryType = Checkmark
反之亦然,但将复选标记更改为无
let cell = tableView.cellForRowAtIndex(indexPath).accessoryType = UITableViewCell.accessoryType = None
如果你为一个简单的方法创建了更复杂的代码,它会给你带来灾难。这种情况的发生是因为tableView的单元格被重用,以最大限度地减少内存使用 如果您使用的是
检查按钮的自定义实现
,则必须存储在数据结构(如数组)中选择的单元格的值,例如,如果您有两个节,每个节中有3个元素,并且在第一节中选择了第二项,然后像数组一样的数据结构可以像[[false,true,false],[false,false.false]]
。
在这里,如果选择了单元格,我将设置为true。更新此数据结构的值,并在应用cellForRowAt
中的图像时从中进行检查,并且仅当数组的indexPath.section和indexPath.row返回true
Bool时才应用检查图像
希望这有帮助。如果有任何疑问,请随时联系。愉快的编码。您可以通过使用集合大大简化代码。不需要在数组中循环
var selectedPaths=Set<IndexPath>()
func buttonTappedOnCell(cell: customeCell) {
if let indexPath = self.tableView.indexPath(for: cell) {
var image = UIImage(named: "CheckMark")
if self.selectedPaths.contains(indexPath) {
image = UIImage(named: "UnCheckMark")
self.selectedPaths.remove(indexPath)
} else {
self.selectedPaths.insert(indexPath)
}
cell.checkMarkButton.setBackgroundImage(image, for: .normal)
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) as! YourCellType
...
var image = UIImage(named: "UnCheckMark")
if self.selectedPaths.contains(indexPath) {
image = UIImage(named: "checkMark")
}
cell.checkMarkButton.setBackgroundImage(image, for: .normal)
return cell
}
var selectedPaths=Set()
func按钮附加单元格(单元格:customeCell){
如果让indexPath=self.tableView.indexPath(for:cell){
var image=UIImage(名为“选中标记”)
如果self.selectedPaths.contains(indexPath){
image=UIImage(名为“取消选中标记”)
self.selectedPaths.remove(indexPath)
}否则{
self.selectedPaths.insert(indexPath)
}
cell.checkMarkButton.setBackgroundImage(图像,用于:。正常)
}
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
让cell=tableView.dequeueReusableCell(带有标识符:“identifier”,for:indexPath)作为!YourCellType
...
var image=UIImage(名为“取消选中标记”)
如果self.selectedPaths.contains(indexPath){
image=UIImage(名为“选中标记”)
}
cell.checkMarkButton.setBackgroundImage(图像,用于:。正常)
返回单元
}
您可以在表中为自定义单元格设置属性的位置显示您的代码吗?也许可以使用Eureka表单?您需要将indepath
保存在数组中,而不仅仅是行中(或者更好,使用set
而不是数组)@LazyCoder检查这个方法在表custom class中的使用情况-:@Paulw11用代码更新了这个问题,我已经按照你的建议做了。但我仍然面临问题谢谢你的快速回复。它工作得很好,需要对您的答案进行一些小的更正,您需要在下面的if条件中将图像名称从复选标记更改为取消复选标记。if self.selectedPaths.contains(indexPath){因为如果NSSet包含indexPath,我们需要取消选中复选标记。对不起,我搞错了。我会更新它。@objc func checkbox(cell:CheckboxCell){如果让indexath=self.tableView.indexath(for:cell)作为CheckboxCell{}//在强制错误中无法将indexPath类型的值转换为CheckboxCell类型,有什么想法吗?indexath(for:)
返回一个indepath
而不是UITableViewCell
,因此您的下拉列表无效。很抱歉,这是一个输入错误。不需要在那里进行下拉列表。谢谢您的建议,我的回答也很好