首页 > 解决方案 > UISwitch TableViewCell

问题描述

我有几个带有 UISwitch 作为附件视图的单元格,只要数据正确,我就可以切换它们。我遇到的问题是,当我切换一个然后滚动时,另一个被切换,而当我向后滚动时,我切换的那个不再打开。我假设这与重新加载的单元格有关。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        switch indexPath.row {
        case 0, 1, 3, 4, 6, 8, 10, 12, 14, 16:
            var cell = tableView.dequeueReusableCell(withIdentifier: "Cell")

            if cell == nil
            {
                cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "Cell")
            }

            cell?.selectionStyle = .none
            cell?.textLabel?.text = questions[indexPath.row]
            cell?.textLabel?.numberOfLines = 0

            let answerSwitch = UISwitch(frame: .zero)
            answerSwitch.isOn = false
            answerSwitch.addTarget(self, action: #selector(switchToggled(sender:)), for: .valueChanged)
            answerSwitch.tag = indexPath.row
            cell?.accessoryView = answerSwitch

            return cell!
        case 2, 5, 7, 9, 11, 13, 15, 17:
            let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionDetailCell", for: indexPath) as! RAProfileQuestionDetailCell
            cell.selectionStyle = .none
            cell.questionLabel.text = questions[indexPath.row]
            cell.answerField.inputAccessoryView = self.keyboardToolbar
            cell.answerField.tag = indexPath.row

            return cell
        default:
            let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionCell", for: indexPath) as! RAProfileQuestionCell
            return cell
        }
    }

开关切换:

@objc func switchToggled(sender: Any) {
        let answerSwitch = sender as! UISwitch
        print(answerSwitch.tag)
        switch answerSwitch.tag {
        case 0:
            if answerSwitch.isOn {
                self.pre_existing = true
            } else {
                self.pre_existing = false
            }
        case 1 :
            if answerSwitch.isOn {
                self.take_medication = true
            } else {
                self.take_medication = false
            }
        case 3:
            if answerSwitch.isOn {
                self.suicide = true
            } else {
                self.suicide = false
            }
        case 4:
            if answerSwitch.isOn {
                self.previous_treatment = true
            } else {
                self.previous_treatment = false
            }
        case 6:
            if answerSwitch.isOn {
                self.surgery = true
            } else {
                self.surgery = false
            }
        case 8:
            if answerSwitch.isOn {
                self.family_substance_abuse = true
            } else {
                self.family_substance_abuse = false
            }
        case 10:
            if answerSwitch.isOn {
                self.allergies = true
            } else {
                self.allergies = false
            }
        case 12:
            if answerSwitch.isOn {
                self.other_drug_use = true
            } else {
                self.other_drug_use = false
            }
        case 14:
            if answerSwitch.isOn {
                self.alcohol = true
            } else {
                self.alcohol = false
            }
        case 16:
            if answerSwitch.isOn {
                self.tobacco = true
            } else {
                self.tobacco = false
            }
        default:
            break
        }
    }

标签: iosswiftuitableviewuiswitch

解决方案


表格单元格被重用,另外在这里您创建另一个 1false作为默认值

let answerSwitch = UISwitch(frame: .zero)
answerSwitch.isOn = false
answerSwitch.addTarget(self, action: #selector(switchToggled(sender:)), for: .valueChanged)
answerSwitch.tag = indexPath.row
cell?.accessoryView = answerSwitch

但是你需要

answerSwitch.isOn = // set old value 

您所做的相同切换switchToggled应该cellForRowAt根据indexPath.row,或创建一个模型数组,但您的问题是单元格混乱,因此数组实现有点不容易


推荐阅读