如何从tableViewCell中删除KVO观察者?

时间:2015-11-02 21:37:09

标签: ios swift key-value-observing

我知道这可能不是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()
      }
   }
}

1 个答案:

答案 0 :(得分:4)

实施deinit方法并将ignoreFrameChanges()放入其中

deinit
{
  ignoreFrameChanges()
}

在取消分配对象之前调用该方法