搜尋

首頁  >  問答  >  主體

ios7 - 关于ios的表示图问题,UITableView

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

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

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

全部回覆(3)我來回復

  • 怪我咯

    怪我咯2017-04-17 13:05:59

    先解釋下

    [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
    

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

    然後

    [_items removeObjectAtIndex:indexPath.row];
    

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

    [tableView reloadData]
    

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

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

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

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:05:59

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

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:05:59

    [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時候,必先進行資料更新的原因

    回覆
    0
  • 取消回覆