为什么我的UIView在删除观察者后第一次被初始化,但之后呢?
问题描述:
我有一个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
}
}
答
所以,当你第一次点击那么这是第一个点击名为@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
现在当你点击该按钮,你希望它会做。
我认为这里有一个困惑,UIView在其他地方被删除,但按钮。问题是,它第一次被删除,它不会被释放,但第二次,如果我添加它,然后尝试删除它将释放并调用deinit()。我很困惑为什么它不会第一次调用deinit() – TheeBen
我有你的代码在一个项目中。当我第一次运行并单击按钮时,deinit不会被调用,导致视图未被加载,但第二次被调用导致它被加载。您必须在按钮被点击之前加载视图。我提到我把它放在viewDidLoad中,当我第一次调用deinit时点击它。 –
嗯,即使第一次点击按钮,我也没有任何问题。我不知道为什么你没有得到视图加载,但你不应该把它放在viewDidLoad加载视图。就像我说的问题是,当我点击其他地方删除视图(我有视图加载),但我没有得到deinit()调用 – TheeBen