При повторном использовании ячейки и установке UISwitch активным или нет, ios listview устанавливает активными первую строку и последнюю, что не так?

#ios #swift #uitableview #uiswitch

#iOS #swift #uitableview #uiswitch

Вопрос:

Мой приведенный выше код должен заполнить список ios признаком моей модели:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->
    UITableViewCell {
        tableView.registerNib(UINib(nibName: "SymptomTableCell", bundle: nil),
                              forCellReuseIdentifier: "cell")

        if let cell = tableView.dequeueReusableCellWithIdentifier("cell")
            as? SymptomTableCell {
            print(indexPath.row)
            print(cell)
            let symptom = symptoms[indexPath.row]
            if Editor.isEditing {
                cell.setDatasource(symptom, isSelected:
                    hasSymptom(symptomsEdit, oid: symptom.oid))
            } else {
               cell.setDatasource(symptom, isSelected: cell.swItem.on)
            }
            cell.tag = Helper.random()
            cell.backgroundColor = UIColor.clearColor()
            cell.selectionStyle = UITableViewCellSelectionStyle.None
            tableCells.append(cell)
            return cell
        }
    return UITableViewCell()
}
  

первая ячейка

последняя ячейка

Эти два моих объекта для выполнения UITableView Вы можете просмотреть прикрепленные изображения, чтобы понять ошибку:

 import Foundation
import EVReflection

class Symptom: EVObject {
    var oid = ""
    var name = ""
}


import UIKit

class SymptomTableCell: UITableViewCell {

    var symptom: Symptom?
    @IBOutlet weak var swItem: UISwitch!
    @IBOutlet weak var lblItem: UILabel!

    func setDatasource(symptom: Symptom, isSelected: Bool) {
        self.symptom = symptom
        lblItem.text = symptom.name
        swItem.on = isSelected
    }
}
  

Комментарии:

1. 1) Не вызывайте registerNib inside cellForRowAtIndexPath . Сделайте это один раз в viewDidLoad . 2) Не используйте dequeueReusableCellWithIdentifier . Используйте dequeueReusableCellWithIdentifier:forIndexPath: . Он не может вернуть nil ячейку.

2. Вероятно, это потому, что вы вызываете registerNib внутри cellForRowAtIndexPath

Ответ №1:

Пара вещей. Во-первых, как упоминал rmaddy в комментарии, удалите:

 tableView.registerNib(UINib(nibName: "SymptomTableCell", bundle: nil),
                          forCellReuseIdentifier: "cell")
  

из cellForRowAtIndexPath , это нужно ввести viewDidLoad() .

Во-вторых, в вашем пользовательском классе cell я бы переопределил prepareForReuse и установил переключатели в выключенное состояние, а затем включил их по мере необходимости в cellForRowAtIndexPath вашем VC, как у вас сейчас:

 class SymptomTableCell: UITableViewCell {

    var symptom: Symptom?
    @IBOutlet weak var swItem: UISwitch!
    @IBOutlet weak var lblItem: UILabel!

    override func prepareForReuse() {
         self.swItem.setOn(false, animated: false)
    }

    func setDatasource(symptom: Symptom, isSelected: Bool) {
        self.symptom = symptom
        lblItem.text = symptom.name
        swItem.on = isSelected
    }

}