Добавьте функцию prepareForReuse () в свой пользовательский класс ячеек и по умолчанию отключите состояние переключателя. -:

транно: я просто настроил новый iOS-проект с одним представлением и поместил TableView в Main.storyboard. В этом TableView я поместил TableViewCell, а в эту ячейку - UILabel и UISwitch. Для этого TableViewCell я создал CocoaTouchClass MyTableViewCell и установил его для класса TableViewCell в Interfacebuilder. Я подключил розетки для UILabel и UISwitch к MyTableViewCell, а также действие для коммутатора. Также я подключил источник данных TableView и делегировал ViewController.

Итак, как мне кажется, основные вещи для накрытия стола.

Мой ViewController выглядит так:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var tableData = [[String: Bool]]()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    for index in 1...40 {
        self.tableData.append([String(index): index%2 == 0])
    }
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.tableData.count
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "mycell", for: indexPath) as! MyTableViewCell
    let object = tableData[indexPath.row].first!

    cell.myLabel.text = object.key
    cell.mySwitch.setOn(object.value, animated: false)

    return cell
}

}

Итак, я заполняю таблицу несколькими строками данных и включаю каждый второй переключатель UIS.

MyTableViewCell-Class также не представляет собой ничего особенного:

class MyTableViewCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var mySwitch: UISwitch!

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 switched(_ sender: UISwitch) {
    print("Switched: \(sender.isOn)")
}

}

Хорошо, запустите iOS-симулятор, и я вижу таблицу, как и ожидалось. 40 таблиц не помещаются на одном экране, поэтому TableView обеспечивает прокрутку.

Теперь: когда я изменяю состояние одного UISwitch и перетаскиваю TableView, чтобы измененный UISwitch исчез из поля зрения, а затем перетаскиваю TableView, чтобы измененный UISwitch снова становился видимым, он возвращается в исходное состояние. Событие Switch запускается как должно.

Итак, что я делаю не так? Я что-то пропустил?

Я записал 4-секундный скринкаст, чтобы продемонстрировать, что происходит:http://b-bereich.de/download/swiftSwitch.mov

Ответы на вопрос(3)

Ваш ответ на вопрос