2013-02-19 14 views
8

Quindi ho uno UITableView che rappresenta una libreria video. L'origine dati della libreria è NSMutableDictionary che contiene uno NSMutableArray per ciascuna delle sue chiavi. Ciascuno degli array contiene una matrice con tutte le informazioni per ciascun valore.Inserimento di righe ed eliminazione di righe contemporaneamente. UITableView

NSMutableDictionary -> Foreach Key a NSMutableArray che contiene ->NSMutableArrays.

tableSectionData è la mia origine dati.

Ho cercato di inserire una riga nella prima sezione ed eliminare un'altra riga in un'altra sezione. Questo è il codice che sto usando:

EDIT Questo è il nuovo tentativo. Per prima cosa aggiorno l'origine dati e poi aggiungo ed elimina le righe corrispondenti che sono indicizzate con my 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]; 

Ho pensato che questo avrebbe funzionato dal momento che ho per eliminare prima fila se voglio inserire uno (nel caso che voglio fare entrambe le cose.)

L'errore specifico è il seguente:

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

So cosa dice l'errore, che non ho un numero corrispondente di righe sulla sezione, ma non vedo il mio errore sul codice e ho registrato l'origine dati e corrisponde al risultato desiderato.

Qualsiasi aiuto e suggerimento sarebbe molto apprezzato!

risposta

-3

Penso che avete bisogno di ricaricare UITableView ogni volta che si inserisce o si elimina le righe con ritorno esatto numero di righe in numberOfRowsInSection ...

+0

Ho già provato questo, ma non ha funzionato. Attaccherò agli aggiornamenti di inizio e fine! – Joze

9

Devi fare tutti gli aggiornamenti finali aggiornamenti metodi all'interno di inizio /. È valido sempre se si dispone di più di un aggiornamento di UITableView.

E non dimenticare aggiornare dataSource prima che EndUpdates abbia chiamato!

[self.tableView beginUpdates]; 

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

[self.tableView endUpdates]; 

tuo errore qui - è che si sta utilizzando diverse sezioni iniziare/aggiornamenti finali nel codice di esempio

+0

Come per i commenti del codice, dichiaro già che ho già provato questo motivo per cui ho provato a farlo in sezioni separate. Quindi questo non è il problema. Inoltre, insertRowsAtIndexPaths deve essere DOPO deleteRowsAtIndexPaths o non funzionerà in base alla documentazione e ai test che ho già effettuato. Grazie comunque per il tuo suggerimento. – Joze

4

Dov'è il tuo dataSource?

prima eliminazione

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

prima di aggiungere

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

Ehi, grazie, l'ho già fatto (o molto probabilmente sto sbagliando) Guarda il primo per dove iterò attraverso il clone della mia fonte di dati. My dataSource è tableSectionData, lì aggiungo e rimuovo gli oggetti in questione. Quello che sto cercando di fare è trasferire una riga di una sezione in un'altra sezione. Non vedo l'errore nel mio codice ... – Joze

+0

posso sapere quale codice usi nel metodo ** numberOfSectionsInTableView: ** and ** tableView: numberOfRowsInSection: **? –

+0

So che quelle parti di UITableViewDelegate sono corrette, è più un problema dell'ordine in cui vengono chiamati gli aggiornamenti. il metodo reloadData ha funzionato per me, ma continuo a non capire perché l'inserimento e l'eliminazione non funzionano. Guarda la domanda aggiornata. – Joze

Problemi correlati