Несколько переключателей в массиве активируются при нажатии только одного Swift - PullRequest
0 голосов
/ 24 мая 2018

Я работаю над приложением посещаемости, которое загружает и хранит все свои данные в базе данных 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)
        }
    }

Кто-нибудь знает, почему это может происходить?Если вам нужно больше информации, ЛМК.TIA -Ben

1 Ответ

0 голосов
/ 24 мая 2018

Кто-нибудь знает, почему это может происходить?

Таблицы повторно используют свои ячейки, чтобы им не приходилось выделять новые, что дорого, когда пользователь пытается это сделать.быстро пролистать множество строк.Вы настраиваете наблюдателя для переключателя в каждой ячейке, что означает, что вам нужно прекратить наблюдать за этим переключателем, когда ячейка больше не видна.Вы могли бы, вероятно, вызвать stopObservation() в методе prepareForReuse() ячейки и решить проблему.

Лучшим решением было бы избежать полного наблюдения за переключением, и вместо этого использовать механизм цели / действия, который элементы управления обычно используют дляинициировать действие, когда пользователь меняет свое значение.Таким образом, вам не нужно беспокоиться о постоянном запуске и прекращении наблюдения.

...