2012-07-29 18 views
35

Estoy usando UITableViewController y obtengo este error al actualizar tableView. A continuación se muestra el código:NSInternalInconsistencyException ', razón:' intento insertar la fila 0 en la sección 0, pero solo hay 0 filas en la sección 0 después de la actualización '

Esto ocurre cuando hago un evento de clic:

[timeZoneNames insertObject:@"HELLO" atIndex:0]; 
[self.tableView beginUpdates]; 
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]; 
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop]; 
[self.tableView endUpdates]; 

He intentado buscar la documentación de manzana pero eso no ayudó.

Gracias, Aby

Respuesta

27

he encontramos con este problema antes. Esto significa que cuando se llamaba -insertRowsAtIndexPaths:withRowAnimation:-tableView:numberOfRowsInSection: regresaron 0. Es necesario insertar en el modelo antes de llamar -insertRowsAtIndexPaths:withRowAnimation: (ver: -beginUpdates)


actualización

Me pregunto lo que el valor de retorno de -tableView:numberOfRowsInSection: es ? Además, no necesita -beginUpdates/-endUpdates si solo tiene una actualización.

[timeZoneNames insertObject:@"HELLO" atIndex:0]; 
// Let's see what the tableView claims is the the number of rows. 
NSLog(@"numberOfRowsInSection: %d", [self tableView:self.tableView numberOfRowsInSection:0]); 
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]; 
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop]; 
+0

yo ya hice eso .. [timeZoneNames InsertObject: @ "HOLA" atIndex: 0]; número de filas son siempre más que 1. Todavía me sale este error .. – insomiac

+0

tipo de retorno de numberOfRowsInSection es [count timeZoneNames]; ¿Está bien utilizar insertRowsAtIndexPaths sin beginUpdates y endUpdates? De – insomiac

+0

@Aby 'documentación -beginUpdates': "Llamar a este método si desea inserciones posteriores, eliminación y operaciones de selección (por ejemplo, cellForRowAtIndexPath: y indexPathsForVisibleRows) para ser animado al mismo tiempo." Se usa para agrupar varias operaciones de UI en una sola operación de UI: solo tienes una operación. –

4

he intentado imprimir el número de filas y secciones eran en realidad en el tableView durante la actualización, que me hizo pensar, ¿cuántas secciones voy a volver en la vista de tabla método de fuente de datos ... y esto fue el culpable :

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 0; 
} 

Asegúrese de que usted está volviendo 1 y no 0.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

al menos esta resuelto el problema para mí ...

ACTUALIZACIÓN:

estoy teniendo el mismo problema de nuevo después de que se trabaja desde hace un tiempo. He modificado la aplicación un poco. Mi primera vista es una vista de mesa y cuando haces clic en el botón más en la esquina superior derecha, obtienes otra tabla donde puedes ingresar información. Al hacer clic en hecho, la información se añade al modelo de datos básicos con este código:

- (IBAction)doneButtonPressed:(UIBarButtonItem *)sender 
{ 

MoneyBadgeAppDelegate *appDelegate = 
[[UIApplication sharedApplication] delegate]; 

NSManagedObjectContext *context = 
[appDelegate managedObjectContext]; 
NSManagedObject *newMoment; 
newMoment = [NSEntityDescription 
      insertNewObjectForEntityForName:@"SpendingMoment" 
      inManagedObjectContext:context]; 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"yyyyMMdd"]; 
NSDate *modifiedDate = [dateFormat dateFromString: self.dateTextField.text]; 

[newMoment setValue: modifiedDate forKey:@"date"]; 
[newMoment setValue: descTextField.text forKey:@"desc"]; 

[appDelegate.eventsArray insertObject:newMoment atIndex:0]; 

NSError *error; 
[context save:&error]; 

[self dismissViewControllerAnimated:YES completion:nil]; 

} 

Y confirmó que se incorporaron en el modelo de datos básicos con éxito mediante la impresión de que la consola lo siguiente en mi método viewDidAppear al regresar volver a la primera pantalla.

-(void)viewDidAppear:(BOOL)animated{ 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SpendingMoment" 
inManagedObjectContext:self.managedObjectContext]; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:entity]; 

NSError *error; 
NSArray *items = [self.managedObjectContext 
        executeFetchRequest:fetchRequest error:&error]; 

for (SpendingMoment *moment in items) { 
    NSLog(@"Date: %@, Desc: %@", [moment date], [moment desc]); 
} 

[self addEvent]; 

Y entonces mi método addEvent hace esto:

- (void)addEvent { 

[self.tableScreen beginUpdates]; 

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[self.tableScreen insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 


[self.tableScreen reloadData]; 
[self.tableScreen endUpdates]; 

@try{ 
    [self.tableScreen scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 
@catch(NSException *exception){ 
} 

}

Alguna idea de cuál es el problema esta vez ??? ¡Gracias!

+0

Nunca debe poner 'reloadData' dentro de un bloque' beginUpdates'. Esas dos cosas son mutuamente excluyentes – iwasrobbed

22

Me encontré con este error cuando olvidé configurar correctamente el origen de la fuente de datos.

Si ve este error, compruebe que ha establecido explícitamente su delegado TableView y fuente de datos:

  • ir a su constructor de interfaz y un vistazo a la vista con la 'Tabla'

  • cmd + botón derecho del ratón y arrastre (debería ver una línea azul) desde el icono 'Tabla' al icono de título para el archivo, esto tiene un icono amarillo al lado de él en Xcode 6.

  • soltar el ratón, debería ver delegar y da opciones de tasource.

  • seleccione 'fuente de datos'

su mesa ahora debe estar correctamente conectados.

+3

me lo resolvió –

+0

de esta manera fue correcto para mí. Solo necesito hacer un cable entre el origen de datos y Table !!!!. ¡Y entre delegado y Table !!! No ver el controlador. Pero con Table. –

0

Comprobar este "intento de insertar una fila 0 en la sección 0, pero sólo hay 0 filas en la sección 0 después de la actualización".

Se mesns al insertar objeto en la fila 0, sección 0, ya no hay ninguna sección. Intenta insertar una sección antes de insertar la fila.

[timeZoneNames insertObject:@"HELLO" atIndex:0]; 
NSLog(@"sections: %lu ",[self.downlaodTableView numberOfSections]; 
// insert section 
[self.tableView insertSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 1)] withRowAnimation:UITableViewRowAnimationNone]; 
NSLog(@"numberOfRowsInSection: %d", [self tableView:self.tableView numberOfRowsInSection:0]); 
NSArray *insertIndexPaths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]; 
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationTop]; 
Cuestiones relacionadas