2017-05-25 27 views
1

我在猜測我們應該傾向於使用不可變數組作爲UITableView使用的數據模型陣列。關於這一點的讀物在互聯網上是非常不同的。我會說,這可以防止在tableview顯示數據時修改數組。例如,如果發生上述情況,numberOfRowsInSection:方法可能會產生問題,對(即使我知道它在理論上是可行的,我仍然無法真正想到情況如何在真實世界中發生這種情況)?更新UITableView使用的數據模型陣列的正確方法

現在,在commitEditingStyle:forRowAtIndexPath:方法,我這樣做(messagesArray是可變的):

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
if (editingStyle == UITableViewCellEditingStyleDelete) { 
    Message *message = messageArray[indexPath.row]; 
    [messagesArray removeObject:message]; 
    [self.messageTable deleteRowsAtIndexPaths:[NSArray arrayWithObject: indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 

,而不是(有messagesArray不可改變的)

NSMutableArray *temp = [NSMutableArray arrayWithArray:messagesArray]; 
[temp removeObject:message]; 
messagesArray = [NSArray arrayWithArray:temp]; 

後者的代碼是什麼,我不得不如果messageArray是不可變的。

現在我有兩個問題......國際海事組織(糾正我,如果我錯了),在上面的方法從兩個方面從數組中刪除對象具有相同的效果。消息數組最後刪除了一個元素。就是這樣......但是像後一個例子那樣做,可以讓我擁有不可變的數據模型數組。

有人可以評論什麼實際上是一個首選的方式(或我可以說正確的方式?)以更新數據模型數組後刪除?

回答

1

我寧願有一個可變數組,但將其設爲私有。然後,如果其他課程需要更改數組,您可以提供一個add()方法和一個delete()方法。這兩者都有責任更新數組和表視圖。

+0

它實際上已經是私人了......我更擔心在哪些情況下可能會發生一些混亂,如果我保持它可變...... – Whirlwind

+2

如果更改數組,無論可變性如何,表視圖必須用它來更新,否則你會看到不好的數據並可能崩潰(例如,當你滾動到結尾時索引超出界限的錯誤) – beyerss

1

從表視圖的角度來看,數據源用於組織數據的結構並不重要。表視圖不直接訪問該結構。它要求數據源提供它需要的部分。

現在,你是對的:你可以通過改變支持數據搞亂你的表格視圖。但是,無論特定集合的可變性如何,都會發生這種情況。你的不可變數組片段做同樣的事情:表格視圖不知道任何東西的變化,直到你通知它與deleteRowsAtIndexPaths:animated。當數據源更新時重新加載表視圖是必需的,無論您的數據源在內部執行什麼操作。

+0

好吧,我現在得到你們所說的。不過,我認爲在上面的例子中不需要'reloadData',因爲'deleteRowsAtIndexPaths'會自動更新tableview,對吧?我的意思是,我改變數據模型數組,然後我調用deleteRowsAtIndexPaths,並且tableview會自動更新而不需要發送reloadData? – Whirlwind

+0

是的,對不起,你完全正確。我沒有像我應該那樣徹底地閱讀你的代碼。 –

0

斯威夫特3版本:

func tableView(_ tableView: UITableView, commit editingStyle: 

UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 

     //1. remove data from model 
     dataSource.remove(at: indexPath.row) 

     //2. remove row from view 
     tableView.deleteRows(at: [indexPath as IndexPath], with: .fade) 
    } 
} 

是的!實施輕掃刪除時,無需重新加載數據! UITableView照顧它。你只需要更新你的數據源