为什么我在自定义单元格中的复选框在 swift 中选择和滚动时显示不同的行为?

Why my checkbox in custom cell shows different behaviour while selecting and scrolling in swift?

我有一个 xib 视图,其中我使用 tableView 和 customcell xib。在这个自定义单元格中,我有一个复选框按钮,其行为类似于使用自定义单元格进行选中和取消选中。但是,当我单击第一个单元格复选框作为第 9 行单元格、第 18 行单元格等第 9 行单元格的倍数时,..... 也被选中。在滚动复选框时,勾选选项在单元格之间发生变化。我不知道为什么会这样..??

我已将单元格 xib 视图注册为:

override func viewDidLoad() {
    super.viewDidLoad()
    //Register custom cell
    let nib = UINib(nibName: "CustomOneCell", bundle: nil)
    AddOnTableView.registerNib(nib, forCellReuseIdentifier: "addoncell")
   }
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return ADDONITEMS.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell:CustomOneCell = AddOnTableView.dequeueReusableCellWithIdentifier("addoncell") as! CustomOneCell
    let item: AddOnItems = ADDONITEMS[indexPath.row]
            cell.addOnName.text = item.name
            cell.addOnPrice.text = "£\(item.price!)"


    return cell
}

对于复选框,我添加了一个自定义 class,如下所示:

var isCheckedAddOnGlobal = Bool()
class AddOnCheckBox: UIButton {


let checkedImage = UIImage(named: "checkboxredtick.png")! as UIImage
let unCheckedImage =  UIImage(named:"checkbox untick.png")!as UIImage

//bool property
var ischecked:Bool = false{
    didSet{
        //print(ischecked)
        if ischecked == true{
            self.setImage(checkedImage, forState: .Normal)


        }else{
            self.setImage(unCheckedImage, forState: .Normal)
        }
    }
}

override func awakeFromNib() {
    self.addTarget(self, action:#selector(CheckBox.buttonClicked(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    self.ischecked = false
}

func buttonClicked(sender: UIButton) {

    if (sender == self) {
        if ischecked == true{
            ischecked = false
            isCheckedAddOnGlobal = false

        }else{
            ischecked = true
            isCheckedAddOnGlobal = true

        }

    }

    }
 }

发生这种情况是因为您正在重用 TableViewCell,要解决您的问题,您可以尝试这样的操作,首先创建一个 Int 数组,为您提供选定的行并在 [=12= 中使用该数组] 方法。

var selectedItems = [Int]()

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell:CustomOneCell = AddO nTableView.dequeueReusableCellWithIdentifier("addoncell") as! CustomOneCell
    let item: AddOnItems = ADDONITEMS[indexPath.row]
    cell.addOnName.text = item.name
    cell.addOnPrice.text = "£\(item.price!)"
    cell.checkBoxBtn.tag = indexPath.row
    if (selectedItems.contains(indexPath.row)) {
        cell.checkBoxBtn.setImage(UIImage(named:"checkbox untick.png"), forState: .Normal)
    }
    else {
        cell.checkBoxBtn.setImage(UIImage(named: "checkboxredtick.png"), forState: .Normal)
    }
    cell.checkBoxBtn.addTarget(self, action:#selector(self.buttonClicked(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    return cell
}

func buttonClicked(sender: UIButton) {
     if (self.selectedItems.contains(sender.tag)) {
          let index = self.selectedItems.indexOf(sender.tag)
          self.selectedItems.removeAtIndex(index)
     }
     else {
          self.selectedItems.append(sender.tag)
     }
     self.tableView.reloadData()
}

最好的方法是选择手机通话

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomOneCell
    cell.buttonClicked()
}

并将 buttonClicked 方法更改为

func buttonClicked() {
...
}

我会制作一个包含产品信息和布尔值的对象,以检查产品是否已被选中。

如果您这样做,复选标记将显示正确。当您在表格视图上滚动时,它会在每次显示新单元格时加载数据。

现在,它只知道索引等 9 被选中,当您向下滚动并加载新单元格时,索引 9 将再次自动被选中。

尝试这样的事情:

例子

class Product {
var productName = "Test"
var isSelected: Bool = false
}

在你的 cellForRowAtIndexPath 下

if product.isSelected == true {
    cell.checkBoxBtn.setImage(UIImage(named:"checkbox untick.png"), forState: .Normal)
} else {
    cell.checkBoxBtn.setImage(UIImage(named: "checkboxredtick.png"), forState: .Normal)
}