2017-03-04 18 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

相关问题