Добавьте функцию 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