表格单元格中的UIswitch重复问题

时间:2018-06-22 04:39:27

标签: ios swift uitableview

在我的App中,我有一个包含7个部分的表格视图,每个部分都有8个单元格,其中包含Stepper(在UIView中),UIButton(在UIView中)和UISwitch(在UIview中)。 现在,我可以设置和获取stepper和UIButton的值,但是我的问题是UISwitch。 它被重用并同时显示开/关状态(已显示UI)。 我还维护了一个数组来保存开关的状态,但是它不能正确反映。 下面是代码

var myData1 : [Bool] = [false,false,false,false,false,false,false,false]

 let cell:DefaultTableViewCell = (self.tblviewSwitchPOints.dequeueReusableCell(withIdentifier: "defaultcell", for: indexPath) as? DefaultTableViewCell)!

    cell.viewForButton.tag = indexPath.row
    cell.selectionStyle = .none
    cell.viewForSwitch.tag = indexPath.row
    print("in cell for row")

    if indexPath.section == 0
    {
        switch indexPath.row
        {
        case 0:
            cell.lblMain.text = timePerDay[indexPath.row]
            cell.lblTemp.text = row1[0]
            cell.lblTime.text = row1[1]
            cell.lblMain.tag = indexPath.row
            cell.viewForStepper.addSubview(valueStepper1)
            cell.viewForButton.addSubview(btnCustom1)
            cell.viewForSwitch.addSubview(switchOnOff1)

            if myData1.count==0
            {

            }else
            {
                switchOnOff1.isOn = myData1[0]
            }
            switchOnOff1.tag = 0
            switchOnOff1.addTarget(self,action:#selector(actionOnOff1(sender:)), for:.valueChanged )

            let temp = arrTemp1[indexPath.row]
            if arrTimeInDouble1.count==0
            {

            }else if temp.elementsEqual("FFFF")
            {
                valueStepper1.value = 5
            }else
            {
                 valueStepper1.value = arrTimeInDouble1[indexPath.row]
            }

            valueStepper1.tag = indexPath.row

            btnCustom1.tag = indexPath.row
            if arrTime1.count==0
            {

            }else
            {
                btnCustom1.titleLabel?.text = arrTime1[indexPath.row]
            }

            valueStepper1.addTarget(self, action: #selector(valueChangedTemp1(sender:)), for: .valueChanged)
            btnCustom1.addTarget(self, action:#selector(datePickerTapped1), for: .touchUpInside)
            print("in cell fro row1\(myData1)\(switchOnOff3.isOn)\(switchOnOff1.tag)")
            return cell


         case 1:
            cell.lblMain.text =  timePerDay[indexPath.row]
            cell.lblTemp.text = row2[0]
            cell.lblTime.text = row2[1]
            cell.lblMain.tag = indexPath.row
            cell.viewForStepper.addSubview(valueStepper2)
            cell.viewForSwitch.addSubview(switchOnOff2)
            if myData1.count==0
            {

            }else
            {
                switchOnOff2.isOn = myData1[1]
            }
            switchOnOff2.tag = indexPath.row
            if arrTimeInDouble1.count==0
            {

            }else
            {
                valueStepper2.value = arrTimeInDouble1[indexPath.row]
            }

            cell.viewForButton.addSubview(btnCustom2)
            btnCustom2.tag=indexPath.row
            valueStepper2.tag = indexPath.row

            if arrTime1.count==0
            {

            }else
            {
                btnCustom2.titleLabel?.text = arrTime1[indexPath.row]
            }

            switchOnOff2.addTarget(self, action: #selector(actionOnOff1(sender:)), for:.valueChanged )
            valueStepper2.addTarget(self, action: #selector(valueChangedTemp1(sender:)), for: .valueChanged)
            btnCustom2.addTarget(self, action:#selector(datePickerTapped1), for: .touchUpInside)

            return cell
     }

2 个答案:

答案 0 :(得分:0)

很多地方可能出了问题,但是我怀疑您的情况是每个交换机都分配了多个目标/操作对;您使一个单元出队,然后在交换机上仍旧有目标的交换机上调用addTarget

无论如何,在这些情况下进行处理时最好的方法是将大部分代码放入表视图单元格中。我实际上建议您使用委托将消息从单元格中返回到您的视图控制器,因此出队应该看起来像这样:

let cell: DefaultTableViewCell = tableView.dequeueReusableCell(withIdentifier: "defaultcell", for: indexPath) as! DefaultTableViewCell
cell.myObject = myObjectSections[indexPath.section][indexPath.row]
cell.delegate = self
return cell

没什么。现在,单元格应该执行所有逻辑:

class DefaultTableViewCell: UITableViewCell {

    weak var delegate: DefaultTableViewCellDelegate?
    var myObject: MyObject? {
        didSet { refresh() }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.switch.addTarget(self, action:#selector(switchMoved)), for:.valueChanged)
    }
    func refresh() {
        // Change all UI related stuff here
    }

    @objc private func switchMoved() {
        if let myObject = myObject {
            delegate?.defaultTableViewCell(self, didChangeWhateverStateOf:myObject to: switch.on)
        }
    }

}

自然地,需要适当定义协议。就我而言是

protocol DefaultTableViewCellDelegate: class {
    func defaultTableViewCell(_ sender: DefaultTableViewCell, didChangeWhateverStateOf myObject: MyObject, to flag: Bool)
}

,并且您的视图控制器需要实现此协议。

有时,实际上也可以在数据中添加索引路径。为此,您只需升级此代码,以便单元格还包含var indexPath: IndexPath!。现在,在使单元出队后,您可以为其分配新的索引路径。然后可以在您的委托方法中随时访问它:

extension MyViewController: DefaultTableViewCellDelegate {
    func defaultTableViewCell(_ sender: DefaultTableViewCell, didChangeWhateverStateOf myObject: MyObject, to flag: Bool) {
        print("This is cell at section \(sender.indexPath.section), row: \(sender.indexPath.row)")
    }

}

答案 1 :(得分:0)

如果您在其中创建带有UISwitch的自定义单元格会很好。然后,您可以像这样为开关分配值-

    var cell : SwitchTableViewCell? = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier") as? SwitchTableViewCell
    if(cell == nil)
    {
        cell = SwitchTableViewCell(style: .default, reuseIdentifier: "CellIdentifier")
    }
    if(indexPath.section == 0)
    {
        if(myData1.count != 0)
        {
            cell?.switchOnOff.isOn = myData1[indexPath.row];
        }
    }
    return cell!;