我知道这可能不是MVC的最佳实践,但我在自定义tableViewCell中有一个观察者知道我何时扩展了单元格(下面的代码)。当我按下导航栏上的后退按钮时,应用程序崩溃,“当一个实例TableViewCell被释放,而键值观察者仍然注册了它。”如何检查单元格是否正在观察,以及当用户点击后退按钮时如何删除观察者?非常感谢!!!
class ClientDetailTableViewCell: UITableViewCell {
// Sets default and expanded cell heights
class var expandedHeight:CGFloat { get { return 150 } }
class var defaultHeight:CGFloat { get { return 50 } }
// sets to check if a row has been clicked
var frameAdded = false
// checks if height to see if buttons are hidden
func checkHeight () {
button1.hidden = (frame.size.height < PersonTableViewCell.expandedHeight)
}
// Start Key Value Observing
func watchFrameChanges() {
if(!frameAdded) {
addObserver(self, forKeyPath: "frame", options: NSKeyValueObservingOptions.New, context: nil)
frameAdded = true
}
}
// Stop Key Value Observing Changes
func ignoreFrameChanges() {
if(frameAdded) {
removeObserver(self, forKeyPath: "frame")
frameAdded = false
}
}
// If the observer adds keypath for "frame", run checkHeight()
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if keyPath == "frame" {
checkHeight()
}
}
}
答案 0 :(得分:4)
实施deinit
方法并将ignoreFrameChanges()
放入其中
deinit
{
ignoreFrameChanges()
}
在取消分配对象之前调用该方法