就是在删除某行的时候为什么要先删除数据模型中的实例
例如以下例子:
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
[_items removeObjectAtIndex:indexPath.row];
//为什么要有以上代码,不要以上代码为什么不行,_items是一数组,而且放在后面这行代码的后面也不行这是为什么
NSArray *indexPaths = @[indexPath]; //还有这段代码能具体解释下吗
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
}
先解釋下
這是對介面的操作,用了點動畫刪除了你要刪除的那一行,只是操作UI,不操作資料。
然後
這個才是真正的操作數據。你這個_items應該是tableView的dataSource吧?只有在操作UI的時候才把資料來源(_items)裡邊的資料真正的刪除了,在
的時候,你之前刪掉的資料才不會再重新顯示出來啊。
至於那兩行程式碼為什麼必須是那個順序,就不知道了...希望有高手來回答一下,我們學習一下~
回答中有不對的地方請各位批評指正
NSArray *indexPaths = @[indexPath];
這行程式碼新建了一個數組指針,指向傳過來的下標。注意,這只是個指針,對其的操作會影響indexPath
如果你在下面那行中將object刪去,那麼指標所指向的indexPath也會受到影響,因而之後再呼叫indexPath的時候,其值已經改變。建議你在這兩行程式碼之中,在日誌裡輸出indexPath的值(或row的值),看看是否發生了變化。
上述程式碼你可以看作
兩者差異在於,第一種只是針對某一行(Cell)刪除,而不必更新整個UITableView而造成資源浪費,同時亦提供了更好看的特效;第二種方法更生硬一些
光這個方法很難有說服力,下面我拿
來做範例
假設我們是新增行,如果你先呼叫了
insertRowsAtIndexPaths:withRowAnimation:
,UITableView將呼叫
tableView:cellForRowAtIndexPath:
去取得新增行的cell想必在程式碼
tableView:cellForRowAtIndexPath:
裡面你們都會這樣寫很明顯因為你沒有添加數據,這裡會造成訪問越界
這就是為什麼在更新UITableView的UI時候,必先進行資料更新的原因