tableView刪除功能小記

因爲項目須要,作一個 UITableView來實現刪除功能。
效果如圖:
Assertion <wbr>failure <wbr>in <wbr>-[UITableView <wbr>_endCellAnimationsWithCon<wbr>text:]-請不要讓

功能思路其實不難:
交代一下,我本身要實現的效果:
1. TableView是分組的。
2.點擊刪除按鈕後,某行被刪除。
 
寫完,大概功能,運行:
 
出現:
 

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:1070html

libc++abi.dylib: handler threw exceptionc++

 
緣由:
 
1.在調用deleteRowsAtIndexPaths:方法前,要確保數據爲最新。也就是說,先將要刪除的數據從數據源中刪除。
 
2.分組和分組中行數是變更的,不能寫成死的!
 
3.若是是分組,你會發現很怪的現象:當一個分組中,有多條數據時,你刪除其中一條,正確;當一個分組中,你要刪除惟一的一條時,仍然會報出如上的錯誤!
 
本人,就是百思不得其解。反覆調試,數據已經保持最新了的。
 
在網上搜了不少,卻沒有滿意答案。
 
靈感閃過!~~~~
 
刪除某個分組中的最後一條數據時,分組數,和行數都要變。這時候,只調用了deleteRowsAtIndexPaths方法。也就是說,只對行數進行了操做,可是沒有對變更的分組進行操做!
查看幫助API,找到這麼一個方法:deleteSections:方法!
加上去,在刪除某個分組中最後一條記錄時,將該分組也刪除!
 
搞定!搞定!
 
最後,貼一下,實現的關鍵思路:
 
1.計算分組數
 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{url

    return [_arrKeys count];// _arrKeys中存放分組spa

}代理

 
2.計算每一個分組中的個數
 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{調試

    

    NSString* _date = [_arrKeys objectAtIndex:section];htm

    NSArray* _notifications = [_dictData objectForKey:_date];// _dictData存放數據blog

    return [_notifications count];get

 

}it

 
3.添加刪除功能的代理方法
 

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

{

    if (editingStyle == UITableViewCellEditingStyleDelete) {

 

        [self refreshData];// 刷新_arrKeys_dictData中的數據

        int newCount=0;

        if (indexPath.section<[_arrKeys count]) {

            NSString *_date = [_arrKeys objectAtIndex:indexPath.section];

            NSArray* _notifications = [_dictData objectForKey:_date];// _dictData存放數據

            newCount= [_notifications count];

        }

        

        [tableView beginUpdates];

        if (newCount<=0) {

            [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section]withRowAnimation:UITableViewRowAnimationLeft];

        }

        

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationLeft];

        [tableView endUpdates];

        

        

        

    }

    else if (editingStyle == UITableViewCellEditingStyleInsert) {

        // 修改時

    }   

}

 

本文轉載至  http://blog.sina.com.cn/s/blog_7b9d64af0101b6se.html

相關文章
相關標籤/搜索