滚动时,UISwitch正在更改其他单元格上的状态

时间:2017-08-24 08:44:11

标签: ios swift uitableview uiswitch

我的tableview看起来像这样

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! Cell
    return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 200
}

我的tableviewcell看起来像这样

class Cell: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

当我更改任何单元格上的开关状态并滚动时。另一个单元的开关周期性地在滚动时改变其他单元的状态。请帮忙

3 个答案:

答案 0 :(得分:4)

你需要为每个开关设置数据数组,并在你的didSelect方法中为switch切换数据模型然后在cellForRow中从数组获取switch状态,你的viewController需要是SwitchControlDelegate

class UIViewController:SwitchControlDelegate{

    var array = [Bool](count: 200, repeatedValue:false)

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! Cell
    cell.switchControl.isOn = array[indexPath.row]
    cell.switchDelegate = self
    cell.index = indexPath.row
    return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 200
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    array[indexPath.row] = !array[indexPath.row]
}

func switchChangeStateWithIndex(index:Int){
    array[index] = !array[index]
}

当您单击单元格时,这将更改开关状态,如果您需要在更改开关控件时更改状态,则需要委托更新viewController中的数据模型

在您的单元格文件中:

    protocol SwitchControlDelegate: class {
        func switchChangeStateWithIndex(index:Int)
    }

    class Cell: UITableViewCell {

        var index:Int = 0
        weak var switchDelegate: SwitchControlDelegate?
        override func awakeFromNib() {
            super.awakeFromNib()
            // Initialization code
        }

        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)

            // Configure the view for the selected state
        }

        @IBAction func valueChanged(_ sender: AnyObject) {
             switchDelegate?.switchChangeStateWithIndex(index:index)
        }

}

您需要将切换控件的动作值更改与此函数valueChanged进行匹配,因此每次更改切换状态单元格时都需要调用func值更改

答案 1 :(得分:0)

正确处理每个单元格的开关控制,

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

这样当单元格出列时,它会正确处理每个单元格的switchControl

<强>解决方案: 当您更改单元格的开关控制状态时,将indexPath保存在某处,以便在tableview cellForRowAt indexPath中迭代此indexPath时再次设置该开关状态,否则设置默认状态

答案 2 :(得分:0)

可能因为细胞可重复使用而发生。在你的单元格中实现prepareForReuse方法:

class TableCell: UITableViewCell {
    ....

    override func prepareForReuse() {
        super.prepareForReuse()
        self.yourSwitch.isOn = false
    }
}

是的,您还必须使用类似于状态/对象的数组来在单元格中设置正确的开关值。