2012-03-07 14 views
10

Sto utilizzando un UITableViewController per un tavolo nella mia app e ho aggiunto un NSFetchedResultsController per fornire i dati da mostrare nella tabella (impostazione self come delegato).Aggiungi riga aggiuntiva a UITableView gestito da NSFetchedResultsController

Tuttavia, vorrei aggiungere una cella univoca come ultima cella del tavolo, non correlata agli elementi prodotti dal predicato NSFetchedResultsController, voglio che questa cella si trovi sempre nella parte inferiore della tabella.

Ho provato semplicemente aggiunti 1 a questi metodi nella tabella di vista origine dati:

- (NSUInteger)numberOfSectionsInTableView:(UITableView *)sender 
{ 
    return [[self.fetchedResultsController sections] count] + 1; 
} 
- (NSUInteger)tableView:(UITableView *)sender numberOfRowsInSection:(NSUInteger)section 
{ 
    return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects] + 1; 
} 

E poi di prendere il caso in cui tale riga supplementare viene generato in questo modo (tabella ha solo 1 sezione) :

- (UITableViewCell *)tableView:(UITableView *)sender 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == [self.fetchedResultsController.fetchedObjects count]) { 
     //Generate the last cell in table. 
    } else { 
     //Generate the rest of the cells like normal. 
    } 
    return nil; //To keep the compiler happy. 
} 

Questo controlla se l'indice è l'ultima cella e se ne occupa in modo appropriato.

Tuttavia ancora sto ottenendo il seguente errore in fase di esecuzione:

*** Terminating app due to uncaught exception 'NSRangeException', 
reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]' 

Qualche idea di cosa sta causando questo? O c'è un modo migliore di aggiungere una riga in più a una vista tabella controllata da un NSFetchedResultsController?

risposta

13

Il controller di risultati recuperato è legato strettamente al tableview, se si implementano tutti i metodi dell'origine dati come indicato nella documentazione (gli aggiornamenti e così via). Diventerà piuttosto disordinato e hacky.

La tua "riga aggiuntiva" potrebbe essere invece la vista a piè di pagina del tavolo? Questo sarà sempre in fondo. Non sarebbe troppo lavoro per farlo apparire come una cella, anche se dal suo aspetto si desidera che sia diverso dalle altre celle.

+0

Ah sì, sarebbe davvero un modo molto migliore di implementarlo, grazie. (Evidentemente sono ancora molto nuovo alla programmazione iOS :-)) –

+0

Sì, è stato molto hacky. Questa idea è tanto semplice quanto ...Molte grazie! – Shingoo

+0

ma questo sembra - http://stackoverflow.com/questions/10965098/nsfetchedresultscontroller-prepend-a-row-or-sement –

2

Dato il tavolo ha solo una sezione, questo codice sembra sbagliato:

- (NSUInteger)numberOfSectionsInTableView:(UITableView *)sender 
{ 
    return [[self.fetchedResultsController sections] count] + 1; 
} 

Ho il sospetto che il vostro incidente si verifica quando la Tableview tenta di recuperare la seconda sezione; il + 1 dovrebbe essere rimosso.

È possibile eseguire operazioni più complesse con tabelle ricavate da controller di risultati recuperati (vedere NSFetchedResultsController prepend a row or section), quindi sono sicuro che questo semplice caso può essere eseguito.

+0

Ancora la tabellaView: cellForRowAtIndexPath: sarà chiamata [[self.fetchedResultsController sections] count] volte. –

0

Perché non utilizzare solo le visualizzazioni di intestazione e piè di pagina integrate di UITableView?

Esempio:

UIView *customBottomView = [UIView alloc] init... //set up your View (what you called custom bottom cell)

self.table.tableFooterView = customBottomView; // alternativamente tableHeaderView

Tecnicamente si aggiunge una vista che viene visualizzata sotto (o sopra) la tabella che viene aggiunta alla tabella e gestita meravigliosamente dal TableView. Per gli utenti non è possibile determinare se si tratta di una (ultima) cella o semplicemente di una vista. Dovresti solo aggirare il problema se avessi intenzione di utilizzare metodi come didSelectRowAtIndexPath

Problemi correlati