eliminar un elemento de NSMutableArray para una clave específica

Estoy tratando de averiguar cómo eliminar un elemento de este NSMutableArray que estoy usando para una tabla seccionada. Así es como construyo la fuente de datos:

listOfItems = [[NSMutableArray alloc] init];

NSArray *appleComputers = [NSArray arrayWithObjects:@"iPhone",@"iPod",@"MacBook",@"MacBook Pro",nil];
NSDictionary *appleComputersDict = [NSDictionary dictionaryWithObject:appleComputers forKey:@"Computers"];

NSArray *otherComputers = [NSArray arrayWithObjects:@"HP", @"Dell", @"Windows", nil];
NSDictionary *otherComputersDict = [NSDictionary dictionaryWithObject:otherComputers forKey:@"Computers"];

[listOfItems addObject:appleComputersDict];
[listOfItems addObject:otherComputersDict];

Estoy tratando de averiguar cómo eliminar, decir "iPod" de esta matriz. He probado muchas cosas, entre ellas la de abajo, pero nada funcionó.

    [listOfItems removeObjectAtIndex:indexPath.row];

(el problema aquí es que no hay referencia para la sección real ...)

¡Gracias!

ACTUALIZACIÓN: Aquí es donde elimino la fila:

- (void)tableView:(UITableView *)aTableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {


    NSMutableArray * section = [listOfItems objectAtIndex:indexPath.section];    
    [section removeObjectAtIndex:indexPath.row];
[tblSimpleTable reloadData];

} else if (editingStyle == UITableViewCellEditingStyleInsert) {

   // some code...
}

}

preguntado el 27 de agosto de 11 a las 18:08

3 Respuestas

No estoy seguro de por qué estás usando un diccionario ... no parece que lo necesites. ¿Qué tal solo una matriz de matrices?

listOfItems = [[NSMutableArray alloc] init];

NSMutableArray * appleComputers = [NSMutableArray arrayWithObjects:@"iPhone",@"iPod",@"MacBook",@"MacBook Pro",nil];
[listOfItems addObject:appleComputers];

NSMutableArray * otherComputers = [NSMutableArray arrayWithObjects:@"HP", @"Dell", @"Windows", nil];
[listOfItems addObject:otherComputers];

luego

NSMutableArray * section = [listOfItems objectAtIndex:indexPath.section];    
[section removeObjectAtIndex:indexPath.row];

Incluso si tú do necesita usar los diccionarios, todavía no es un gran problema ... solo use NSMutableArray en lugar de NSArray para su appleComputers or otherComputers y haz esto:

NSDictionary * section = [listOfItems objectAtIndex:indexPath.section];
NSMutableArray * sectionComputers = [section objectForKey:@"Computers"];    
[sectionComputers removeObjectAtIndex:indexPath.row];

Respondido 27 ago 11, 22:08

Es un buen comienzo, pero esta solución no actualiza mi fuente de datos original, sino que solo crea una nueva matriz sin el elemento eliminado. - TommyG

No crea una nueva matriz en absoluto. Actualiza la matriz que agregó inicialmente a la lista. Si tiene una "fuente de datos original" que no sea la que ilustró en el código de muestra con elementos estáticos, tal vez debería aclarar su pregunta. - Steve

No. listOfItems es el único. Pero en su código, está creando una "sección" de listOfItems, luego elimina un objeto de la "sección" que es un subconjunto de listOfItems, y ya no forma parte de él. por lo que listOfItems no se actualiza. - TommyG

Creo que estás confundido. no soy la creación section estrellas de listOfItems, Simplemente obtengo una referencia. Si está usando esto por un UITableView, que sospecho que eres, asegúrate de llamar reloadData en la mesa. Además, mantén listOfItems en el nivel de clase (como propiedad / ivar) y suéltelo en dealloc. - Steve

+1 Veo tu punto. Bueno, todavía falla aquí: [sección removeObjectAtIndex: indexPath.row]; He actualizado mi pregunta con el método en el que estoy eliminando la fila, eso es de alguna ayuda. - TommyG

Para su ejemplo, eliminaría todas las entradas de 'iPod' como esta (tenga en cuenta los cambios en las colecciones mutables):

listOfItems = [[NSMutableArray alloc] init];

NSMutableArray *appleComputers = [NSMutableArray arrayWithObjects:@"iPhone",@"iPod",@"MacBook",@"MacBook Pro",nil];
NSMutableDictionary *appleComputersDict = [NSMutableDictionary dictionaryWithObject:appleComputers forKey:@"Computers"];

NSMutableArray *otherComputers = [NSMutableArray arrayWithObjects:@"HP", @"Dell", @"Windows", nil];
NSMutableDictionary *otherComputersDict = [NSMutableDictionary dictionaryWithObject:otherComputers forKey:@"Computers"];

[listOfItems addObject:appleComputersDict];
[listOfItems addObject:otherComputersDict];

...

for (NSMutableDictionary *dict in listOfItems) {
    [dict objectForKey:@"Computers" removeObject:@"iPod"];
}

Respondido 27 ago 11, 23:08

¿Ha probado [array removeObject: @ "iPod"]?

Respondido 27 ago 11, 22:08

No funciona. ¿Qué pasa si tengo varios "iPod"? Necesitaré usar la propiedad indexpath como referencia. Pero gracias. - TommyG

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.