当只有一个按下Swift时,阵列中的多个开关被激活

时间:2018-05-24 16:02:01

标签: arrays swift uitableview firebase swift3

我正在开发一个出勤应用程序,它将所有数据上传并存储在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

1 个答案:

答案 0 :(得分:2)

  

有谁知道为什么会这样?

表重用它们的单元格,以便它们不必继续分配新的单元格,这在用户试图快速滚动很多行时很昂贵。您正在为每个单元格中的开关设置观察者,这意味着当单元格不再可见时,您需要停止观察该开关。您可以在单元格的stopObservation()方法中调用prepareForReuse()并解决问题。

更好的解决方案是避免完全观察交换机,而是使用控制通常用于在用户更改其值时触发操作的目标/操作机制。这样你就不必担心不断开始和停止观察。