我正在开发一个出勤应用程序,它将所有数据上传并存储在firebase中。大多数事情目前都在工作,除非有时当在俱乐部的学生阵列中按下开关时,其中2个开关在阵列中激活,但是当按下开关时正常发送的信息仅发送给我实际按下的开关
这是TableView单元代码:
import UIKit
import Firebase
class StudentCell: UITableViewCell {
var student: Student? { didSet { self.updateUI() }}
@IBOutlet weak var lblStudentName: UILabel!
@IBOutlet weak var lblStudentId: UILabel!
@IBOutlet weak var lblStudentAttending: UISwitch!
let ref = Database.database().reference()
var user: Student! {
didSet{
lblStudentName.text = user.FullName()
lblStudentId.text = user.StudentId
lblStudentAttending.isOn = false
}
}
var switchReference: DatabaseReference?
var switchHandle: DatabaseHandle?
func stopObservation() {
if let handle = switchHandle {
switchReference?.removeObserver(withHandle: handle)
}
}
func startObservation() {
stopObservation()
if let uid = student?.StudentId {
switchReference = ref.child("attendance").child(Global.shared.currentDate).child(uid)
switchReference?.observe(.value, with: { [weak self] (snapshot: DataSnapshot) in
DispatchQueue.main.async {
let isOn = (snapshot.value as? Bool) ?? false
self?.lblStudentAttending.isOn = isOn
}
})
}
}
func updateUI() {
startObservation()
self.lblStudentName.text = self.student?.FullName() ?? ""
self.lblStudentId.text = self.student?.StudentId ?? ""
}
@IBAction func `switch`(_ sender: UISwitch) {
switchReference?.setValue(sender.isOn)
}
}
有谁知道为什么会这样?如果您需要更多信息lmk。 TIA -Ben
答案 0 :(得分:2)
有谁知道为什么会这样?
表重用它们的单元格,以便它们不必继续分配新的单元格,这在用户试图快速滚动很多行时很昂贵。您正在为每个单元格中的开关设置观察者,这意味着当单元格不再可见时,您需要停止观察该开关。您可以在单元格的stopObservation()
方法中调用prepareForReuse()
并解决问题。
更好的解决方案是避免完全观察交换机,而是使用控制通常用于在用户更改其值时触发操作的目标/操作机制。这样你就不必担心不断开始和停止观察。