2012-03-07 14 views
10

estoy usando un UITableViewController para una tabla en mi aplicación, y he añadido un NSFetchedResultsController para proporcionar los datos que mostrar en la tabla (ajuste self ya que es delegado).Añadir fila adicional a un UITableView gestionado por NSFetchedResultsController

Sin embargo, me gustaría agregar una celda única como la última celda de la tabla, sin relación con los elementos producidos por el predicado NSFetchedResultsController, quiero que esta celda siempre esté en la parte inferior de la tabla.

He intentado simplemente añade 1 a estos métodos en la tabla de origen vista de datos:

- (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; 
} 

Y luego coger el caso en que se está generando esta fila adicional al igual que (la tabla sólo tiene 1 sección) :

- (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. 
} 

Esto comprueba si el índice es la última celda y trata adecuadamente.

Sin embargo todavía estoy recibiendo el siguiente error en tiempo de ejecución:

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

Cualquier idea de lo que está causando esto? ¿O hay una forma mejor de agregar una fila adicional a una vista de tabla controlada por NSFetchedResultsController?

Respuesta

13

El controlador de resultados obtenidos está estrechamente vinculado a la vista de tabla, si implementa todos los métodos de fuente de datos como se indica en la documentación (las actualizaciones, etc.). Se pondrá bastante desordenado y hacky.

¿Podría su "fila adicional" ser la vista de pie de página de la tabla? Esto siempre estará en la parte inferior. No sería demasiado trabajo hacer que se vea como una célula, aunque por su aspecto, de todos modos, quieres que se vea diferente a las otras células.

+0

Ah sí, esa sería en realidad una forma mucho mejor de implementar esto, gracias. (Evidentemente, todavía soy muy nuevo en la programación de iOS :-)) –

+0

Sí, se puso muy raro. Esta idea es tan simple como genial ...¡Muchas gracias! – Shingoo

+0

pero esto se ve así - http://stackoverflow.com/questions/10965098/nsfetchedresultscontroller-prepend-a-row- or-section –

2

Teniendo en cuenta la tabla sólo tiene una sección, este código es incorrecto:

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

Sospecho que surge de su accidente cuando el tableview intenta recuperar la segunda sección; el +1 debe ser eliminado.

Es posible hacer cosas más complejas con tablas que provienen de los controladores de resultados obtenidos (ver NSFetchedResultsController prepend a row or section), así que estoy seguro de que este simple caso se puede hacer funcionar.

+0

Aún la tabla Vista: cellForRowAtIndexPath: se llamará [[self.fetchedResultsController sections] count] times. –

0

¿Por qué no utiliza las vistas integradas de encabezado y pie de página de UITableView?

Ejemplo:

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

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

Técnicamente está agregando una vista que se muestra debajo (o encima) de la tabla que se agrega a la tabla y maneja maravillosamente TableView. Para los usuarios no hay manera de determinar si esta es una (última) celda o simplemente una vista. Tendrá que trabajar si planea usar métodos como didSelectRowAtIndexPath

Cuestiones relacionadas