2017-02-25 65 views
2

所以我有兩個UIViewControllers每個都有一個表視圖在每個。第一個有一個按鈕來顯示第二個視圖控制器。第二個視圖控制器有一個按鈕,可以關閉視圖控制器,以便它回到第一個視圖控制器。當我點擊第二個視圖控制器中的解除按鈕時,它會短暫地返回到第一個視圖控制器,然後崩潰。控制檯打印以下錯誤消息。iOS表視圖錯誤 - 釋放,而鍵值觀察員仍然註冊它 - DGElasticPullToRefresh

An instance of class UIScrollViewPanGestureRecognizer was deallocated while key value observers were still registered with it

我真的不知道從哪裏開始尋找,因爲我不知道問題是什麼節,我以前從來沒有過這樣的錯誤,它沒有任何意義,因爲在所有我沒有使用任何UIScrollViewPanGestureRecognizer。我甚至沒有真正知道我正在使用的任何observers

我用下面的代碼展示視圖。

let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main) 
let menuViewController : UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "Menu") as UIViewController 
self.present(menuViewController, animated: false, completion: nil) 

和駁回用下面的代碼視圖控制器。

self.dismiss(animated: false, completion: {}); 

這個錯誤是什麼意思?什麼會導致它?我在堆棧溢出中看到的所有答案都使用代碼,我甚至沒有任何類似的東西,這就是爲什麼我很困惑。

我很肯定基於我的研究,它與我的一個表格視圖有關,但我可能完全錯誤。

+0

我首先查看[這些相關的搜索結果](http://stackoverflow.com/search?q=%5Bswift%5D+was+deallocated+while+key+value+observers+were+still+registered +與+它)。 – rmaddy

+0

我發現的大多數問題包括添加一個觀察者來喜歡UITableViewCell或沿着這些線的東西。我不確定當我沒有添加一個觀察者並且當我不知道關鍵路徑是什麼時我該如何移除觀察者。我的意思是我找到了'removeObserver(self,forKeyPath:「frame」)''代碼,但我不確定關鍵路徑是什麼或放在哪裏。就像我假設它會在UITableViewCell'deinit'方法中一樣。事情似乎還沒有加起來。 –

+0

你在做什麼?從第一個控制器? –

回答

5

在做了一些更多的研究之後,我發現將下面的代碼添加到我的第二個視圖控制器中解決了這個問題。

deinit { 
    self.tableView.dg_removePullToRefresh() 
} 

這是因爲我正在使用庫(DGElasticPullToRefresh)來處理拉動刷新。關於這個的GitHub問題可以在here找到。希望這可以幫助有類似問題或類似問題的其他人。

+1

我不得不採取額外的步驟對錶格視圖保留第二個強有力的參考。我正在使用IBOutlet,我認爲在deinit被調用之前就已經釋放了。 –