2017-03-04 1 views
0

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 
    } 
} 

Antwort

0

Also, wenn Sie zuerst diese und klicken Sie dann @IBAction func seeSocialMedia(_ sender: UIButton) auf dem ersten Klick aufgerufen wird, fügt self.view.addSubview(tstVw!)

dann auf zweiten Klick entfernt es (wenn ich den Code richtig lese). Deshalb wird es beim zweiten Klick entfernt. Ich zog

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!) 

zum viewDidLoad jetzt, wenn Sie auf die Schaltfläche klicken, um es tun, wie Sie wollen.

+0

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

+0

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. –

+0

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

Verwandte Themen