2017-03-04 56 views
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 
    } 
} 

回答

0

所以,當你第一次點擊那麼這是第一個點擊名爲@IBAction func seeSocialMedia(_ sender: UIButton)那添加self.view.addSubview(tstVw!)

然後再點擊它將其刪除(如果我正在閱讀代碼)。這就是爲什麼它在第二次點擊時被刪除。我搬到

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

viewDidLoad現在當你點擊該按鈕,你希望它會做。

+0

我認爲這裏有一個困惑,UIView在其他地方被刪除,但按鈕。問題是,它第一次被刪除,它不會被釋放,但第二次,如果我添加它,然後嘗試刪除它將釋放並調用deinit()。我很困惑爲什麼它不會第一次調用deinit() – TheeBen

+0

我有你的代碼在一個項目中。當我第一次運行並單擊按鈕時,deinit不會被調用,導致視圖未被加載,但第二次被調用導致它被加載。您必須在按鈕被點擊之前加載視圖。我提到我把它放在viewDidLoad中,當我第一次調用deinit時點擊它。 –

+0

嗯,即使第一次點擊按鈕,我也沒有任何問題。我不知道爲什麼你沒有得到視圖加載,但你不應該把它放在viewDidLoad加載視圖。就像我說的問題是,當我點擊其他地方刪除視圖(我有視圖加載),但我沒有得到deinit()調用 – TheeBen

相關問題