Tengo una aplicación que hace todo lo que se supone que debe hacer con las primeras 8 filas de un UITableView ... Una vez que agrego esa novena fila (por lo que la vista de tabla debe desplazarse), la aplicación se bloquea ...

He probado numerosas variaciones, pero nada parece funcionar ... Puedo agregar celdas a mi fila, tantas veces como quiera, pero una vez que "lleno" esa novena fila en la tabla, la aplicación se bloquea con

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

Aquí hay un código que se usa para generar la información en la fila en la vista de tabla (tabledata es un NSMutableArray y areaNumber.text proviene de un customCell)

-(IBAction)save_area:(id)sender {

{
        UITableView *tableView = self.myTable;
        NSInteger sections = tableView.numberOfSections;
        NSMutableArray *cells = [[NSMutableArray alloc]  init];
        for (int section = 0; section < sections; section++) {
            NSInteger rows =  [tableView numberOfRowsInSection:section];
            for (int row = 0; row < rows; row++) {
                NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
                SodTableCell *cell = [self.myTable cellForRowAtIndexPath:indexPath];//**here, for those cells not in current screen, cell is nil**
                [cells addObject:cell];

                [tabledata removeObjectAtIndex:indexPath.row];

                NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
                NSObject * object_areaNumber = [prefs objectForKey:@"tablerow_area_input_by_user"];

                if(object_areaNumber != nil){
                    [tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
                }

                NSUserDefaults *save1 = [NSUserDefaults standardUserDefaults];
                [save1 setObject:self.tabledata forKey:@"tablerow_area_input_by_user"];
                [save1 synchronize];
                NSLog(@"From save button %@",[save1 valueForKey:@"tablerow_area_input_by_user"]);

            }
        }
    }
}

La tabla puede crear fila tras fila tras fila más allá de las 9 celdas, cientos si quisiera, y el desplazamiento funciona ... es cuando completo la información en la novena fila y donde guardar esa información ingresada usando el código que ves arriba. Cualquier ayuda, muy apreciada ...

EDITAR

En mi celda tableViewForRowAtIndexPath:

- (UITableViewCell *) tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

SodTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

if(cell == nil){
    cell = [[SodTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}

if(indexPath.row >= tabledata.count && [self isEditing]){

    cell.areaNumber.text = @"new";

}else{

    cell.areaNumber.delegate = self;
    cell.areaNumber.text = [tabledata objectAtIndex:indexPath.row];

    NSUserDefaults *save1 = [NSUserDefaults standardUserDefaults];
    [save1 setObject:self.tabledata forKey:@"tablerow_area_input_by_user"];
    [save1 synchronize];
    NSLog(@"From cell configuration %@",[save1 valueForKey:@"tablerow_area_input_by_user"]);
}

return cell;
}
0
designer 11 nov. 2017 a las 20:07

2 respuestas

La mejor respuesta

Resuelto

He revisado todos los comentarios hechos con respecto a mi malentendido de UITableViews y el código relacionado ...

Si revisa el siguiente enlace (a mi página de Vimeo), debería ver algunas cosas ingeniosas ...

Ejemplo de trabajo en Vimeo

Pude cargar más de las 8 celdas en mi problema original (como se indicó en la pregunta original) e incluso pude cargar filas vacías que el usuario puede guardar y completar más tarde. ¡Todo está guardado en NSUserDefaults y se puede guardar, editar o eliminar ...

Nuevamente, gracias por su ayuda ... por supuesto, los comentarios que realmente me ayudaron son siempre más bienvenidos y constructivos que los que simplemente señalaron que no sabía lo que estaba haciendo ...

0
designer 13 nov. 2017 a las 02:09

No hablaré sobre cómo usar UITableView de la manera correcta, solo le mostraré por qué se bloqueó.

El error dice que está intentando insertar un objeto nil en una matriz. Como supongo, la raíz del problema es la siguiente línea.

[tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];

Para resolverlo, marque cell.areaNumber.text antes de insertarlo en la matriz.

if(object_areaNumber != nil && cell.areaNumber.text){
    [tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
}
1
trungduc 12 nov. 2017 a las 07:14