tableView滑動刪除返回錯

tableView滑動刪除返回錯誤 [ tableView:canEditRowAtIndexPath:]:message sent t

項目中需要用到tableView滑動刪除這個功能,就很習慣的用tableView的兩個數據源方法

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{

    return YES;

}


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;


結果寫完後,滑動刪除掉一行之後點擊導航欄的返回按鈕居然出現了崩潰現象,而且崩潰是出現在跳回到之前的界面之後,我想着,不可能啊,之前也不是沒有這樣用過,之前都不出問題,怎麼現在出問題了,並且崩潰之後也沒有打印出相關的日誌,也沒有提示信息,直接到了 main 函數裏,我想這樣的崩潰大家是最頭痛的,毫無頭緒,雖然之後在偶然的情況下,我把上面的第一個方法給註釋掉了,後來也就不崩潰了,問題得到了解決,今天,任務不算很重,我重新想想,越想越要把這個問題給徹底的搞明白,於是重新再回到這個demo裏面,我心裏想,一般直接跳到main函數裏的並且不打印任何日誌的崩潰應該和內存有關係(這只是一種直覺,我也不太確定),於是我就沿着這個不太明確的思路慢慢找問題,通過xcode自帶的殭屍方法,這樣一來就會有打印錯誤提示了,具體方法如下:

tableView滑動刪除返回錯誤 <wbr>[ <wbr>tableView:canEditRowAtIndexPath:]:message <wbr>sent <wbr>t

tableView滑動刪除返回錯誤 <wbr>[ <wbr>tableView:canEditRowAtIndexPath:]:message <wbr>sent <wbr>t

保存後,重新運行程序,再重複之前的操作,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 這樣確保萬無一失。


轉載於:http://blog.sina.com.cn/u/1797147142


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章