ios7 - 关于ios的表示图问题,UITableView
天蓬老师
天蓬老师 2017-04-17 13:03:59
0
3
681

就是在删除某行的时候为什么要先删除数据模型中的实例
例如以下例子:

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [_items removeObjectAtIndex:indexPath.row];
    //为什么要有以上代码,不要以上代码为什么不行,_items是一数组,而且放在后面这行代码的后面也不行这是为什么

    NSArray *indexPaths = @[indexPath];  //还有这段代码能具体解释下吗
    [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
}
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(3)
刘奇

先解釋下

[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];

這是對介面的操作,用了點動畫刪除了你要刪除的那一行,只是操作UI,不操作資料。

然後

[_items removeObjectAtIndex:indexPath.row];

這個才是真正的操作數據。你這個_items應該是tableView的dataSource吧?只有在操作UI的時候才把資料來源(_items)裡邊的資料真正的刪除了,在

[tableView reloadData]

的時候,你之前刪掉的資料才不會再重新顯示出來啊。

至於那兩行程式碼為什麼必須是那個順序,就不知道了...希望有高手來回答一下,我們學習一下~

回答中有不對的地方請各位批評指正

大家讲道理

NSArray *indexPaths = @[indexPath];
這行程式碼新建了一個數組指針,指向傳過來的下標。注意,這只是個指針,對其的操作會影響indexPath
如果你在下面那行中將object刪去,那麼指標所指向的indexPath也會受到影響,因而之後再呼叫indexPath的時候,其值已經改變。建議你在這兩行程式碼之中,在日誌裡輸出indexPath的值(或row的值),看看是否發生了變化。

左手右手慢动作
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];

上述程式碼你可以看作

[self.tableView reloadData];

兩者差異在於,第一種只是針對某一行(Cell)刪除,而不必更新整個UITableView而造成資源浪費,同時亦提供了更好看的特效;第二種方法更生硬一些

光這個方法很難有說服力,下面我拿

[tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];

來做範例

假設我們是新增行,如果你先呼叫了insertRowsAtIndexPaths:withRowAnimation:
UITableView將呼叫tableView:cellForRowAtIndexPath:去取得新增行的cell

想必在程式碼tableView:cellForRowAtIndexPath:裡面你們都會這樣寫

NSDictionary *dataDictionary = _items[indexPath.row];

很明顯因為你沒有添加數據,這裡會造成訪問越界

這就是為什麼在更新UITableView的UI時候,必先進行資料更新的原因

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板