2013-02-19 11 views
8

Więc mam UITableView, który reprezentuje bibliotekę wideo. Źródłem danych biblioteki jest NSMutableDictionary, która zawiera NSMutableArray dla każdego z kluczy. Każda z tablic zawiera tablicę ze wszystkimi informacjami dla każdej wartości.Wstawianie wiersza i usuwanie wiersza jednocześnie. UITableView

NSMutableDictionary -> Foreach Key a NSMutableArray, który zawiera ->NSMutableArrays.

tableSectionData jest moim źródłem danych.

Próbowałem wstawić wiersz w pierwszej sekcji i usunąć kolejny wiersz w innej sekcji. To jest kod, którego używam:

EDYCJA To jest nowa próba. Najpierw aktualizuję źródło danych, a następnie dodaje i usuwam odpowiednie wiersze, które są indeksowane moim źródłem danych.

[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]; 

myślałem, że to będzie działać, ponieważ muszę najpierw usunąć wiersz, jeśli chcę wstawić jeden (w przypadku chcę zrobić zarówno.)

Specyficzny błędu jest następujący:

'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).' 

Wiem, co mówi ten błąd, że nie mam odpowiedniej liczby wierszy w sekcji, ale nie widzę mojego błędu na kodzie i zalogowałem się do źródła danych i odpowiada ono żądanemu wynikowi.

Każda pomoc i sugestie będą mile widziane!

Odpowiedz

-3

Chyba trzeba przeładować UITableView każdym włożeniu lub usunąć wiersze z powrotem dokładną liczbę wierszy w numberOfRowsInSection ...

+0

ja już próbowałem, ale nie działa. Będę trzymać się aktualizacji początku i końca! – Joze

9

Musisz zrobić wszystkie aktualizacje wewnątrz rozpoczęcia/zakończenia aktualizacji metod. Jest ważny zawsze, jeśli masz więcej niż jedną aktualizację UITableView.

I nie zapomnij zaktualizować źródła danych przed wywołaniem metody endUpdates!

[self.tableView beginUpdates]; 

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

[self.tableView endUpdates]; 

twój błąd tutaj - jest używasz różne kroki/aktualizacji końcowe odcinki w próbce kodu

+0

Tak jak w komentarzach do kodu już stwierdzam, że już próbowałem, dlatego próbowałem robić to w oddzielnych sekcjach. Więc to nie jest problem. Dodatkowo, insertRowsAtIndexPaths ma być PO ZAKRESIE deleteRowsAtIndexPaths lub nie będzie działać zgodnie z dokumentacją i testami, które już zrobiłem. Dzięki za twoją sugestię. – Joze

4

Gdzie jest twój DataSource?

przed usunięciem

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

przed dodać

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

Hej dziękuję, już to zrobiłem (lub najprawdopodobniej robię to źle) Spójrz na pierwsze dla gdzie I iteracji poprzez klon mojego źródła danych. Moje źródło danych to tableSectionData, tam dodaję i usuwam obiekty, o których mowa. Co próbuję zrobić, to przeniesienie jednego wiersza sekcji do innej sekcji. Nie widzę błędu w moim kodzie ... – Joze

+0

Mogę wiedzieć, jaki kod używasz w metodzie ** numberOfSectionsInTableView: ** i ** tableView: numberOfRowsInSection: **? –

+0

Wiem, że te części UITableViewDelegate są prawidłowe, jest to raczej kwestia kolejności, w której są wywoływane aktualizacje. metoda reloadData działała dla mnie, ale nadal nie rozumiem, dlaczego wstawianie i usuwanie nie działają. Spójrz na zaktualizowane pytanie. – Joze

Powiązane problemy