#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
insidecellForRowAtIndexPath
. Сделайте это один раз в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
}
}