2013-02-19 102 views
8

所以我有一個代表視頻庫的UITableView。庫的數據源是一個NSMutableDictionary,其中包含每個密鑰的NSMutableArray。每個數組都包含一個數組,其中包含每個值的所有信息。同時插入行和刪除行。 UITableView

NSMutableDictionary - > Foreach Key a NSMutableArray包含 - >NSMutableArrays

tableSectionData是我的數據源。

我一直在嘗試在第一部分上插入一行並在另一部分中刪除另一行。這是我正在使用的代碼:

編輯這是新的嘗試。我首先更新數據源,然後添加和刪除與我的dataSource建立索引的相應行。

[mainTableView beginUpdates]; 
    NSMutableDictionary *clone = [[NSMutableDictionary alloc] 
          initWithDictionary:self.tableSectionData copyItems:YES]; 
    for (NSString *key in [clone allKeys]) { 
     if([key isEqualToString:@"Videos available for download"]) { 
      for (NSArray *videoArray in [clone objectForKey:key]) { 
       if ([[videoArray objectAtIndex:0] isEqualToString:helper.videoName]) { 
        [[self.tableSectionData objectForKey:@"Downloaded videos"] 
               addObject:videoArray]; 
        NSUInteger insertIndex = [[self.tableSectionData 
               objectForKey:@"Downloaded videos"] 
                 indexOfObject:videoArray]; 
        NSIndexPath *pathToInsert = [NSIndexPath 
             indexPathForRow:insertIndex inSection:0]; 
        NSArray *indexesToAddition = [NSArray 
                arrayWithObject:pathToInsert]; 
        [mainTableView insertRowsAtIndexPaths:indexesToAddition 
            withRowAnimation:UITableViewRowAnimationFade]; 
        [[self.tableSectionData 
      objectForKey:@"Videos available for download"] removeObject:videoArray]; 
        NSUInteger deleteIndex = [[self.tableSectionData 
     objectForKey:@"Videos available for download"] indexOfObject:videoArray]; 
        NSIndexPath *pathToDelete = [NSIndexPath 
             indexPathForRow:deleteIndex inSection:1]; 
        NSArray *indexesToDeletion = [NSArray arrayWithObject: 
                    pathToDelete]; 
        [mainTableView deleteRowsAtIndexPaths:indexesToDeletion 
            withRowAnimation:UITableViewRowAnimationFade]; 

       } 
      } 
     } 
    } 
    [mainTableView endUpdates]; 

我想這會工作,因爲我必須先刪除行,如果我想插入一個(在情況下,我想兩者都做。)

特定的錯誤是:

'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (4) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).' 

我知道什麼錯誤說,我沒有相應的行數的部分,但我沒有看到我的代碼上的錯誤,我登錄數據源,它對應於所需的結果。

任何幫助和建議將不勝感激!

回答

-3

我認爲你需要每次插入或在numberOfRowsInSection返回行的確切數目刪除行的時間來重新加載的UITableView ...

+0

我已經嘗試過這一點,但沒有奏效。我將堅持開始和結束更新! – Joze 2013-02-19 13:47:18

9

你必須做的所有更新中開始/結束的更新方法。如果您有多個UITableView更新,它總是有效的。

並且不要忘記在updateUpdate調用之前更新dataSource!

[self.tableView beginUpdates]; 

    // do your staff here, like: 
[self.tableView inserRowsAtIndexPaths:indexPathsToInsert]; 
[self.tableView deleteRowsAtIndexPaths:indexPathsToDelete]; 

[self.tableView endUpdates]; 

在這裏你的錯誤 - 是您的代碼示例中使用不同的開始/結束更新部分

+0

至於代碼的意見,我已經聲明,我已經試過這個,這就是爲什麼我試圖在不同的部分。所以這不是問題。另外,insertRowsAtIndexPaths必須在deleteRowsAtIndexPaths之後,否則它將無法按照文檔和我已經做的測試工作。無論如何感謝您的建議。 – Joze 2013-02-19 14:38:21

4

哪裏是你的數據源

之前刪除

[dataSource removeObjectAtIndex:nIndexDelete]; 
[mainTableView deleteRowsAtIndexPaths:indexesToDeletion 
            withRowAnimation:UITableViewRowAnimationFade]; 

前加

[dataSource inserObject:object atIndex:nIndexAdd]; 
[mainTableView insertRowsAtIndexPaths:indexesToAddition 
             withRowAnimation:UITableViewRowAnimationFade]; 
+0

嘿,謝謝,我已經這樣做了(或者很可能我做錯了)看看我通過我的dataSource的克隆進行迭代的第一步。我的dataSource是tableSectionData,我添加和刪除有問題的對象。我正在嘗試將一節的一行轉移到另一節。我沒有看到我的代碼中的錯誤... – Joze 2013-02-19 15:27:57

+0

我可以知道你在方法** numberOfSectionsInTableView中使用什麼代碼:**和** tableView:numberOfRowsInSection:**? – 2013-02-19 15:54:32

+0

我知道UITableViewDelegate的那些部分是正確的,它更多的是調用更新的順序問題。 reloadData方法適用於我,但我仍然不明白爲什麼插入和刪除不起作用。看看更新後的問題。 – Joze 2013-02-20 09:41:09