tableView滑動刪除返回錯誤 [ tableView:canEditRowAtIndexPath:]:message sent t
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
結果寫完後,滑動刪除掉一行之後點擊導航欄的返回按鈕居然出現了崩潰現象,而且崩潰是出現在跳回到之前的界面之後,我想着,不可能啊,之前也不是沒有這樣用過,之前都不出問題,怎麼現在出問題了,並且崩潰之後也沒有打印出相關的日誌,也沒有提示信息,直接到了 main 函數裏,我想這樣的崩潰大家是最頭痛的,毫無頭緒,雖然之後在偶然的情況下,我把上面的第一個方法給註釋掉了,後來也就不崩潰了,問題得到了解決,今天,任務不算很重,我重新想想,越想越要把這個問題給徹底的搞明白,於是重新再回到這個demo裏面,我心裏想,一般直接跳到main函數裏的並且不打印任何日誌的崩潰應該和內存有關係(這只是一種直覺,我也不太確定),於是我就沿着這個不太明確的思路慢慢找問題,通過xcode自帶的殭屍方法,這樣一來就會有打印錯誤提示了,具體方法如下:
保存後,重新運行程序,再重複之前的操作,bug 出現了,右下角也有打印出日誌了,問題如下:
[HistoryViewController tableView:canEditRowAtIndexPath:]: message sent to deallocated instance 0x10930c140
也就是說,tableView:canEditRowAtIndexPath 這個方法有問題,那我就納悶兒了,這個方法怎麼可能會有問題,難怪我之前註釋掉了這個方法就沒問題了,果然是這裏有問題,知道了問題針對它解決掉也就不會是什麼難事兒了,我初步懷疑是 return YES 的問題,
於是,我在函數里加了這樣幾行代碼
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.bgTableView setEditing:NO];
}
然後再重新運行,重複之前的操作,問題解決了,perfect,,,,
雖然問題解決了,但是還是覺得,canEditRowAtIndex 這個方法應該不會有問題,於是我再 ios 6 的模擬器下運行程序,重複操作沒問題(當然註釋掉viewWillDisappear 方法),後來到網上找了好多資料,很大神都說可能是蘋果自身的問題,ios7 纔有這個問題,ios6 以及以下不會出現這種問題,
至此,問題得到解決,以上列出了兩種解決方案:1,刪掉canEditRowAtIndexPath這個方法不用,不會出問題;
2,加上上面說的 viewWillDisappear 方法也可以解決問題;但是我個人推薦第二種方法,雖然第一種方法也是可以解決問題的,但是個人還是覺得這兩個方法配套使用比較好。
最終總結出問題 可能是在 canEditRowAtIndexPath 這個方法裏設置了YES然後返回的時候沒有把它設置成 NO 所以報錯,ios6會自動設置成NO,iOS7 就手動設置成 NO也可以。所以以後無論什麼版本,我們都加上viewWillDisappear手動設置 editing 這個屬性爲NO 這樣確保萬無一失。