包含自定义单元格的{UITableview

时间:2016-04-08 14:44:41

标签: swift uitableview

您好我的应用中存在问题

我正在使用UITableView和自定义单元格。在每个细胞中,我有一个 复选框,当我检查它时,它将单元格的元素变为a 组。除了一个小问题外,一切都正常。

问题:

enter image description here 2

在我点击第一行时的图像中,第10行似乎正在显示 喜欢检查。图像已更改为已检查但实际上已完成 没有出现在我的设置中。

以下是代码的相关部分

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! TblCell
    cell.labelInCell.text = tableData[indexPath.row]//data.myFunc().myset[indexPath.row]
    cell.checkBoxInCell.tag = indexPath.row
    cell.checkBoxInCell.addTarget(self, action: Selector("yourCheckBoxClicked:"), forControlEvents: .TouchUpInside)

    // cell.images.image = UIImage(named: tableData[indexPath.row])
    // if images name is same as in tableData put it in front of label

    return cell
}

func yourCheckBoxClicked(cbx:UIButton){

    let picked = self.tableData[cbx.tag]
    if choosenSet.contains(picked) {
        choosenSet.remove(picked) // uncheck
    } else {
        choosenSet.insert(picked) // check
    }
    print(choosenSet)

}

部分中的行数 - >

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return tableData.count
    }

复选框类 - >

class checkBox: UIButton {


    //images
    let checkedImage = UIImage(named: "button_checkboxFilled")
    let uncheckedImage = UIImage(named: "button_checkboxEmpty")

    // Bool Property
    var isChecked : Bool = false {
        didSet{
            if isChecked == true{
                self.setImage(checkedImage, forState: .Normal)
            }else {
                self.setImage(uncheckedImage, forState: .Normal)
            }
        }
    }

    override func awakeFromNib() {
        self.addTarget(self, action: "buttonClicked:" , forControlEvents: UIControlEvents.TouchUpInside)
        self.isChecked = false
    }


    func buttonClicked (sender:UIButton) {
        if (sender == self) {
            if isChecked == true {
                isChecked = false

            }else {
                isChecked = true
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

这是因为细胞重复使用。您应该将此行添加到func tableView(tableView:cellForRowAtIndexPath:)方法:

cell.checkBoxInCell.isChecked = choosenSet.contains(tableData[indexPath.row])

答案 1 :(得分:0)

您的单元格可以重复使用,快速解决方案可以很好地工作,因为您的表格视图没有很多单元格:

let cell: TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell" + String(indexPath.row)) as! TblCell

如果你的tableView有很多行,那么#34; cell"标识符并更新每个cellForRowAtIndexPath电话上的选择方式