Estoy encontrando con el siguiente error al borrar el último registro de un UITableView.

De terminación de la aplicación debido a una excepción no capturada
‘NSInternalInconsistencyException’, la razón: no es Válido » actualización: no válido
número de filas en la sección 0. El número de filas contenidas en un
sección existente después de la actualización (3) debe ser igual al número de
las filas contenidas en esa sección antes de la actualización (1), más o menos
el número de filas insertadas o eliminar de esa sección (1 insertada,
1 eliminados) y más o menos el número de filas que se mueve dentro o fuera de
esa sección (0 movido en, 0 mudado).’

Mi objetivo es mostrar «Sin Registro encontrado» si la matriz de tabla está vacía.

Este es el código que estoy usando. Cuando puedo borrar el último registro de la tabla de la matriz de la aplicación se bloquea. ¿Cómo es posible cargar la tabla y mostrar «Sin Registro Encontrado» etiqueta?

//Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if ([idArray count]==0) {
return  3;
}
else 
{
return [idArray count];
}   
}
//Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"array count %d",[idArray count]);
if ([idArray count] == 0) {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.textAlignment = UITextAlignmentCenter;
tableView.userInteractionEnabled = NO;
self.navigationItem.leftBarButtonItem.enabled = NO;
NSUInteger row = [indexPath row];
switch (row) {
case 0:
cell.textLabel.text = @"";
break;
case 1:
cell.textLabel.text = @"";
break;
case 2:
cell.textLabel.text = @"No Records Found";
break;
default:
break;
}        
return cell;
}
else
{   static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
tableView.userInteractionEnabled = YES;
self.navigationItem.leftBarButtonItem.enabled = YES;
//Set up the cell
identify *idItems = [idArray objectAtIndex:indexPath.row];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd MMM,yyyy"];
NSString *dateStr = [formatter stringFromDate:idItems.Date];
UIImageView *accDis = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Arrow.png"]];    
cell.accessoryView = accDis;
self.idTableView.separatorColor = [UIColor colorWithRed:150.0/255.0 green:150.0/255.0 blue:150.0/255.0 alpha:1];
cell.textLabel.textColor = [UIColor blackColor];
cell.textLabel.font = [UIFont boldSystemFontOfSize:18];
cell.textLabel.adjustsFontSizeToFitWidth = YES;
cell.detailTextLabel.textColor = [UIColor colorWithRed:100.0/255.0 green:100.0/255.0 blue:100.0/255.0 alpha:1];
cell.detailTextLabel.font = [UIFont italicSystemFontOfSize:16];
cell.detailTextLabel.adjustsFontSizeToFitWidth = YES;
NSString *detailText = [NSString stringWithFormat:@"%@ - %@",dateStr,idItems.GeoCode];
if (idItems.Image == NULL) {
cell.imageView.image = [UIImage imageNamed:@"icon58x58.png"];
}
else
{
//pass image to fix size 50 X 50
//UIImage *newImage = [self postProcessImage:idItems.Image];
cell.imageView.image = idItems.thumb;//newImage; 
cell.imageView.contentMode=UIViewContentModeScaleAspectFill;
}
cell.textLabel.text = idItems.TypeName; 
cell.detailTextLabel.text = detailText;
return cell;   
}    
}
- (void)tableView:(UITableView *)tv commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath {
if(editingStyle == UITableViewCellEditingStyleDelete) {
if ([idArray count] >=1) 
{
[idTableView beginUpdates];
//Get the object to delete from the array.
identifyObject = [appDelegate.idArray objectAtIndex:indexPath.row];
//Delete the object from the table.
[self.idTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[appDelegate removeID:identifyObject];
if ([idArray count] == 0) {
[self.idTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
[idTableView endUpdates];
}
}
}
en la línea que hace el bloqueo de la aplicación? lo de registro de la consola?
Los registros de bloqueo, por favor. – EDIT: ah, no. La encontró.
Gracias Actualizado el registro de Bloqueo

OriginalEl autor Desmond | 2012-01-22

3 Comentarios

  1. 14

    El problema es que un formato tableview espera que las operaciones realizadas en la vista para que coincida con la fuente de datos. Tiene un registro en la tabla, y que se retire. El formato tableview está esperando el origen de datos para contener ahora cero registros, pero a causa de su «registros no encontrados» de la lógica, que en realidad devuelve un valor de 3, por lo tanto el error de coherencia, y su bloqueo.

    El error parece ser que esta parte:

    if ([idArray count] == 0) {
    [self.idTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

    Supongo que esto era la intención de insertar el «registros no encontrados» fila en la tabla cuando la última línea se elimina, pero dado que sus «registros no encontrados» en realidad se extiende por tres filas, es necesario insertar tres filas de este lugar, como este:

    if ([idArray count] == 0) {
    [self.idTableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:
    [NSIndexPath indexPathForRow:0 inSection:indexPath.section],
    [NSIndexPath indexPathForRow:1 inSection:indexPath.section],
    [NSIndexPath indexPathForRow:2 inSection:indexPath.section],
    nil] withRowAnimation:UITableViewRowAnimationFade];
    }

    Para usted propia cordura sin embargo, puedo sugerir un enfoque diferente? En lugar de tratar de mantener a su mesa y origen de sincronización, mientras que los malabares de estos falsos tres filas de datos que están allí sólo para los fines de la presentación, ¿por qué no sólo tiene que insertar un UILabel en la vista de jerarquía (ya sea delante o detrás del formato tableview) que dice «registros no encontrados» y mostrar/ocultar se basa en si la tabla tiene datos? De esa manera se puede controlar con precisión su posición y el aspecto sin tener que joder con el origen de datos lógica.

    Gracias, nick. Voy a tratar está fuera
    Así que… ¿ funciona?
    funciona en cierto punto, el último de la fila se retira…pero muestran un curioso error. me acaban de tomar ur asesorar a mostrar y UILabel sin registro encontrado.

    OriginalEl autor Nick Lockwood

  2. 10

    Reglas generales para tratar de eliminar las filas son:

    1. Acuerdo con su modelo de
    2. Lidiar con la fila de animación de

    Así, por ejemplo:

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
    NSInteger row = [indexPath row];
    [yourModel removeObjectAtIndex:row]; //you need to update your model
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]    withRowAnimation:UITableViewRowAnimationFade];
    }
    }

    Ahora, en mi opinión, el código podría ser el siguiente (he escrito algunos comentarios a la guía).

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
    //Get the object to delete from the array.
    identifyObject = [appDelegate.idArray objectAtIndex:indexPath.row];
    [appDelegate removeID:identifyObject]; //update model first
    //now you can check model count and do what you want
    if ([appDelegate.idArray count] == 0) //I think you mean appDelegate.idArray
    {   
    //do what you want
    //with  [self.idTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
    else
    {
    [self.idTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
    }
    }

    Espero que ayude.

    OriginalEl autor Lorenzo B

  3. 2

    Yo estaba usando el mismo enfoque en el que se utiliza una celda de «No hay filas» de advertencia.

    Para mí, esto funcionó:

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
    [favs removeObjectAtIndex:indexPath.section];
    if ([favs count] == 0) {
    [tableView reloadRowsAtIndexPaths:[[NSArray alloc]initWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
    [tableView setEditing:NO animated:YES];
    //Remove Edit bar button item
    self.navigationItem.rightBarButtonItem = nil;
    }
    else {
    //Animate the deletion from the table.
    [tableView deleteRowsAtIndexPaths:[[NSArray alloc]initWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
    }
    }

    }

    Gracias, funcionó para mí beautifullyyy…

    OriginalEl autor Breeno

Dejar respuesta

Please enter your comment!
Please enter your name here