0
我有一個UIView添加到父級ViewController,它有一個Firebase觀察者,當UIView從父級控制器中被移除時,它將被刪除。但是,第一次刪除UIView時,不會調用deinit(),但是如果再次添加並刪除,每次都會調用deinit()。我無法弄清楚爲什麼,有什麼想法?爲什麼我的UIView在刪除觀察者後第一次被初始化,但之後呢?
的UIView與觀察者:
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 ")
}
}
這裏的括號的UIViewController它通過點擊一個按鈕添加的UIView:
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
}
}
我認爲這裏有一個困惑,UIView在其他地方被刪除,但按鈕。問題是,它第一次被刪除,它不會被釋放,但第二次,如果我添加它,然後嘗試刪除它將釋放並調用deinit()。我很困惑爲什麼它不會第一次調用deinit() – TheeBen
我有你的代碼在一個項目中。當我第一次運行並單擊按鈕時,deinit不會被調用,導致視圖未被加載,但第二次被調用導致它被加載。您必須在按鈕被點擊之前加載視圖。我提到我把它放在viewDidLoad中,當我第一次調用deinit時點擊它。 –
嗯,即使第一次點擊按鈕,我也沒有任何問題。我不知道爲什麼你沒有得到視圖加載,但你不應該把它放在viewDidLoad加載視圖。就像我說的問題是,當我點擊其他地方刪除視圖(我有視圖加載),但我沒有得到deinit()調用 – TheeBen