Ich habe eine UIView, die zu einem übergeordneten ViewController hinzufügt, und es hat einen Firebase-Beobachter, den ich entferne, wenn UIView vom übergeordneten Controller entfernt wird. Aber das erste Mal, dass ich die UIView entferne, wird deinit() nicht aufgerufen, aber nachdem ich es erneut hinzugefügt und entfernt habe, wird deinit() jedes Mal aufgerufen. Ich kann nicht herausfinden warum, irgendeine Idee?Warum wird mein UIView nicht nach dem Entfernen des Beobachters initialisiert, aber danach ist es?
UIView mit dem Betrachter:
class TestView: UIView {
var ref = FIRDatabase.database().reference()
var hndlI : FIRDatabaseHandle?
hndlI = ref.child(node).observe(.childAdded , with: { (snap) in
...
}
func rmvObsr() { //this method is called in parent controller before removing the UIView to remove the observer
ref.child(node).removeAllObservers()
}
deinit {
print("de initing ")
}
}
Hier paren UIViewController, die UIView auf Knopfdruck durch Antippen ergänzt:
class ParentController: UIViewController {
weak var tstVw: TestView?
//adding UIView
@IBAction func seeSocialMedia(_ sender: UIButton) {
let view = TestView()
tstVw = view
tstVw?.frame = CGRect(x: 50, y: 60, width: self.view.frame.width-100, height: self.view.frame.height-200)
self.view.addSubview(tstVw!)
}
//removing UIView by tapping elsewhere
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
tstVw?.rmvObsr() //removing observer
tstVw?.removeFromSuperview()
tstVw = nil
}
}
Ich denke, es gibt hier eine Verwirrung, die UIView wird entfernt, wenn anderswo angetippt, aber die Taste. Das Problem ist, dass das erste Mal wenn es entfernt wird, es nicht veröffentlicht wird, aber das zweite Mal, wenn ich es hinzufüge und dann versuche, es zu entfernen, wird es release und deinit() wird aufgerufen. Ich bin verwirrt, warum es deinit() beim ersten mal nicht anrufen wird – TheeBen
Ich habe deinen Code in einem Projekt. Wenn ich zum ersten Mal laufe und auf den Knopf klicke, wird Deinit nicht aufgerufen, weil die Ansicht nicht geladen wurde, aber das zweite Mal wird es aufgerufen, weil es geladen wurde. Sie müssen die Ansicht laden, bevor Sie auf die Schaltfläche klicken. Ich erwähnte, dass ich es in die ViewDidLoad steckte und als ich es das erste Mal anwählte, wurde deinit aufgerufen. –
hmm, ich habe kein Problem, die Ansicht beim ersten Tippen auf die Schaltfläche zu laden. Ich bin mir nicht sicher, warum Sie die Ansicht nicht laden, aber Sie sollten nicht in ViewDidLoad, um die Ansicht zu laden. Wie ich schon sagte Problem ist, wenn ich anderswo tippen, um die Ansicht zu entfernen (ich habe die Ansicht geladen), aber ich bekomme nicht deinit() Anruf – TheeBen