objective-c ios uitableview crash

objective c - Fallo de aserción en-



objective-c ios (12)

Espero que esto sea una solución rápida. He estado tratando de descubrir el error que sigo recibiendo. El error se enumera a continuación y el appdelagate está debajo de eso.

Cualquier ayuda es apreciada.

Gracias

2012-04-12 21: 11: 52.669 Chanda [75100: f803] --- Error de aserción en -[UITableView _endCellAnimationsWithContext:] , /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037 2012-04-12 21: 11: 52.671 Chanda [75100: f803] --- Aplicación de finalización debido a la excepción no NSInternalInconsistencyException '' NSInternalInconsistencyException '', razón: ''Actualización inválida: número inválido de filas en la sección 0. Número de filas contenidas en una sección existente después de la actualización (2 ) debe ser igual al número de filas contenidas en esa sección antes de la actualización (2), más o menos el número de filas insertadas o eliminadas de esa sección (1 insertado, 0 eliminado) y más o menos el número de filas movidas a o fuera de esa sección (0 movido adentro, 0 movido hacia fuera). ''

#import "AppDelegate.h" @implementation AppDelegate @synthesize window = _window; @synthesize databaseName,databasePath; - (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { self.databaseName = @"Customers.db"; NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDir = [documentPaths objectAtIndex:0]; self.databasePath = [documentDir stringByAppendingPathComponent:self.databaseName]; [self createAndCheckDatabase]; return YES; } - (void)createAndCheckDatabase { BOOL success; NSFileManager *fileManager = [NSFileManager defaultManager]; success = [fileManager fileExistsAtPath:databasePath]; if (success) return; NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseName]; [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; } @end


Al eliminar filas, recuerde que también verifica las secciones al actualizar, en:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView

Si desea eliminar una fila que sea el último elemento de una sección, deberá eliminar toda la sección (de lo contrario, podría obtener un recuento incorrecto de la sección e incluir esta excepción).


Como Sun Tzu said : lo mejor es ganar sin luchar . En mi caso cada vez que veo este tipo de mensaje de error (es decir, la discrepancia entre las filas añadidas se elimina, etc.) ... ni siquiera depuro nada ... simplemente evito hacer esa llamada extra donde recargo las filas, etc. eso es el 99% de los casos donde ocurre este error

Este es un escenario común donde ocurre este error: tengo un UINavigationController y tiene un UITableView , cuando hago clic en una fila, UITableView un nuevo UITableView y así sucesivamente. Este error siempre me pasa cuando UITableview la última UITableview y vuelvo a la UITableView anterior, en este punto realizo una llamada innecesaria a la función loadIt que básicamente inserta las filas y transfiere UITableView .

La razón por la que esto sucede es porque coloqué erróneamente mi función viewDidAppear:animated en viewDidAppear:animated lugar de viewDidLoad . viewDidAppear:animated se llama viewDidAppear:animated cada vez que se muestra viewDidLoad , viewDidLoad solo se llama una vez.


No olvides actualizar tu matriz que determina numberOfRowsInSection. Necesita ser actualizado antes de animar y eliminar

Verificamos si el número de filas en la sección es 1 porque tendremos que eliminar toda la sección.

Corrígeme si alguien puede aclarar esta respuesta.

[self.tableView beginUpdates]; if ([tableView numberOfRowsInSection:indexPath.section] == 1) { [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade]; } else { [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; } [self.tableView endUpdates];


No veo la razón para que nos muestres esta parte del código. Tu error debe estar conectado a esta parte en tu código, supongo

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

Probablemente está cometiendo un error en uno de estos métodos de fuente de datos. Actualmente es imposible decir qué es exactamente incorrecto, pero supongo que podría ser algo así como: le está diciendo a la vista de tabla en numberOfRowsInSection que le gustaría tener n filas reservadas y configuradas y en el cellForRowAtIndexPath solo maneja n - 1 filas para ejemplo.

Lamento que esta respuesta no pueda ser tan precisa como debería ser. Si nos muestra su implementación de su fuente de datos, sería mucho más fácil saber qué está sucediendo.


Podría ser uno de los métodos de protocolo UITableViewDataSource

por

- tableView:numberOfRowsInSection:

debe devolver un número entero igual a la suma o resultado de

-insertRowsAtIndexPaths:withRowAnimation: y / o -deleteRowsAtIndexPaths:withRowAnimation :

por

- numberOfSectionsInTableView:

debe devolver un número entero igual a la suma o resultado de

-insertRowsAtIndexPaths:withRowAnimation: y / o -deleteSections:withRowAnimation:


Puse cada elemento de sección en matrices separadas. Luego póngalos en otra matriz (arrayWithArray). Mi solución aquí para este problema:

[quarantineMessages removeObject : message]; [_tableView beginUpdates]; if([[arrayWithArray objectAtIndex: indPath.section] count] > 1) { [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indPath] withRowAnimation:UITableViewRowAnimationBottom]; } else { [_tableView deleteSections:[NSIndexSet indexSetWithIndex:indPath.section] withRowAnimation:UITableViewRowAnimationFade]; } [_tableView endUpdates];


Si está utilizando un NSFetchedResultsController como yo y está actualizando datos en un hilo de fondo, no olvide comenzar y finalizar las actualizaciones en el delegado:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { [self.tableView beginUpdates]; } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [self.tableView endUpdates]; }


Simplemente me sucedió esto mientras usaba Swift y una tienda de datos respaldada por FRC para administrar la información. Agregar una simple comprobación a la operación de eliminación para evaluar el indexPath.section actual me permitió evitar una llamada extraña. Creo que entiendo por qué ocurre este problema ... Básicamente, cargo un mensaje en la fila superior siempre que mi conjunto de datos esté vacío. Esto crea un problema de apagado por una ya que hay una fila falsa.

Mi solución

... delete my entity, save the datastore and call reloadData on tableView //next I add this simple check to avoid calling deleteRows when the system (wrongly) determines that there is no section. if indexPath.section > 0 { tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .None) }


Simplemente verifique que llame a [yourTableView reloadData]; después de modificar la matriz de valores.


Tuve el mismo error, que al intentar con [tableView reloadData] funcionaba bien. El error fue en realidad en la línea

[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];

Cuando intenté verificar los valores de indexPath, no eran correctos, como se requería.

Lo arreglé cambiando los valores en indexPathsArray .

Espero que esto ayude .


Tuve el mismo problema con una base de datos básicos. Si usa muchos FRC, solo necesita volver a cargar la vista de tabla dentro de cada condición en numberOfSectionsInTableView.


Yo tenía el mismo error.

Estaba usando las siguientes líneas

UINib *myCustomCellNib = [UINib nibWithNibName:@"CustomNib" bundle:nil]; [tableView registerNib:myCustomCellNib forCellReuseIdentifier:@"CustomNib"];

para registrar el plumín en el método viewDidLoad, ya que tenía un plumín diferente que también estaba asociado con la misma clase. Por lo tanto, la línea

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"GBFBLoadingCell"];

estaba devolviendo nil a menos que registrara el plumín en viewDidLoad.

Mi problema es que olvidé configurar el identificador en el inspector de atributos para mi archivo "CustomNib.xib" y "CustomNib ~ iphone.xib". (O más precisamente, me olvidé de presionar enter después de escribir el identificador en el inspector de atributos en XCode, de modo que el nuevo nombre no se guardó).

Espero que esto ayude.