从返回导航的单元格中删除观察者

Posted

技术标签:

【中文标题】从返回导航的单元格中删除观察者【英文标题】:Remove Observers from Cells on back navigation 【发布时间】:2016-12-13 09:34:37 【问题描述】:

我有一个带有单元格的 TableView,我向它们添加了一个观察者。 我在 willDisplay 上向 Cell 添加了一个观察者:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
    let cell = cell as! CustomCell
    cell.watchFrameChanges()

我在 didEndDisplaying 上删除它:

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) 
    let cell = cell as! CustomCell
    cell.unwatchFrameChanges()

CustomCell 方法:

func watchFrameChanges() -> Void 
    self.addObserver(self, forKeyPath: "frame", options: NSKeyValueObservingOptions.new, context: nil)


func unwatchFrameChanges() -> Void 
    if self.observationInfo != nil 
        self.removeObserver(self, forKeyPath: "frame")
    

问题是当我从包含这个 TableView 的 ViewController 导航回来时,观察者没有被删除,我得到这个错误:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An instance 0x7f892d216800 of class MyProject.CustomCell was deallocated while key value observers were still registered with it.

导航返回时如何正确移除观察者?

【问题讨论】:

【参考方案1】:

试试这个

override func viewWillDisappear(animated: Bool)     
    super.viewWillDisappear(animated)
    for row in 0...(array.count-1) 
        let indexPath = NSIndexPath(forRow: row, inSection: 0)
        if let cell = tableView.cellForRowAtIndexPath(indexPath) as? CustomCell 
            cell.unwatchFrameChanges()
        
    

【讨论】:

以上是关于从返回导航的单元格中删除观察者的主要内容,如果未能解决你的问题,请参考以下文章

尝试快速从数组中删除时,不应删除 tableview 单元格中的最后一个单元格

单击单元格文本时如何从单元格中删除文本

如何从 tableview 的单元格中删除 imageView,并重置单元格的高度

如何从uitableview单元格中删除单元格

如何使用键盘在 Excel 单元格中下拉菜单? [关闭]

Swift - 可编辑表格样例(可直接编辑单元格中内容移动删除单元格)