2010-07-12 14 views
7

Estoy escribiendo una aplicación para mostrar algunas noticias de un portal. Las noticias se obtienen usando un archivo JSON de Internet y luego se almacenan en un NSMutableArray utilizando el Modelo CoreData. Obviamente, un usuario no puede eliminar las noticias del archivo JSON en Internet, pero puede ocultarlas localmente. Los problemas vienen aquí, donde tengo el siguiente código:NSMutableArray removeObjectAtIndex: throws invalid argument exception

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {  
if (editingStyle == UITableViewCellEditingStyleDelete) { 
    if(!moc){ 
     moc = [[NewsFetcher sharedInstance] managedObjectContext]; 
    } 
    [[dataSet objectAtIndex:indexPath.row] setEliminata:[NSNumber numberWithBool:YES]]; 
    NSError *error; 
    if(![moc save:&error]){ 
     NSLog(@"C'è stato un errore!"); 
    } 
    [dataSet removeObjectAtIndex:indexPath.row]; 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; 
} 

La línea:

[dataSet removeObjectAtIndex:indexPath.row];

causa mis aplicaciones se bloquee con el siguiente error:

2010-07-12 19:08:16.021 ProvaVideo[284:207] * -[_PFArray removeObjectAtIndex:]: unrecognized selector sent to instance 0x451c820 2010-07-12 19:08:16.022 ProvaVideo[284:207] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[_PFArray removeObjectAtIndex:]: unrecognized selector sent to instance 0x451c820'

estoy tratando de entender por qué no funciona, pero no puedo. Si reinicio la aplicación, la nueva se cancela lógicamente correctamente. ¿Alguna sugerencia? Gracias por adelantado.


Interfaz:

@interface ListOfVideo : UITableViewController <NSFetchedResultsControllerDelegate> { 
    NSMutableArray *dataSet; 
} 
@property (nonatomic, retain) NSMutableArray *dataSet; 

// In the .m file: 
@synthesize dataSet; 

inicialización en viewDidLoad:

dataSet = (NSMutableArray *) [[NewsFetcher sharedInstance] 
           fetchManagedObjectsForEntity:@"News" 
           withPredicate:predicate 
           withDescriptor:@"Titolo"]; 
[dataSet retain]; 

updateDatabase ... esto es cuando la comprobación de nuevas noticias de la red, los agrego en el MutableArray:

[dataSet addObject:theNews]; 
+1

¿Estás seguro de que el conjunto de datos es un NSMutableArray? Si no responde a removeObjectAtIndex: podría ser un NSArray. –

+1

No es un 'NSMutableArray' si no responde a ese selector. Es posible que no lo cree correctamente o use por error una propiedad ['copy'] (http://stackoverflow.com/questions/3220120/nsmutablearray-addobject-nsarrayi-addobject-unrecognized-selector-sent-to/3220137#3220137). Si tiene dudas intente probarlo usando '-isKindOfClass:'. –

+0

umble, no es un NSMutableArray, sino: @interface ListOfVideo: UITableViewController {NSMutableArray * dataSet; } @property (nonatomic, retener) NSMutableArray * dataSet; ... // En el archivo .m @synthesize dataSet; – IssamTP

Respuesta

23

Su NewsFetcher le devuelve una matriz inmutable, no una instancia mutable. Utiliza el siguiente lugar para la inicialización:

NSArray *results = [[NewsFetcher sharedInstance] 
        fetchManagedObjectsForEntity:@"News" 
        withPredicate:predicate 
        withDescriptor:@"Titolo"]; 
dataSet = [results mutableCopy]; 

una expresión como A *a = (A*)b; solamente arroja el puntero a un tipo diferente - y no convierte el/cambiar el tipo real de la instancia que apunta.

+0

LMAO Funciona. Qué novato soy. – IssamTP

5

Verifique que dataSet sea un NSMutableArray. La excepción se lanza porque no responde a removeObjectAtIndex.

+0

Mumble, no es un NSMutableArray, sino: @interface ListOfVideo: UITableViewController { \t NSMutableArray * dataSet; } @property (no atómico, retener) NSMutableArray * dataSet; ... // En el archivo .m @synthesize dataSet; – IssamTP

+2

La propiedad de una matriz mutable no hace que la matriz se vuelva mágicamente mutable. –

+0

@Joshua, aunque no lo hace "mágicamente", lo hace mutable, evitará que una matriz mutable se mute si no está definido correctamente. – BlackHatSamurai

1

Jdot es dataSet correcta debe ser NSMutableArray ..

que debe hacerlo de esta manera ..

dataSet = [NSMutableArray arrayWithArray:[[NewsFetcher sharedInstance] 
           fetchManagedObjectsForEntity:@"News" 
           withPredicate:predicate 
           withDescriptor:@"Titolo"]]; 

Ahora el conjunto de datos es una instancia mutable de la matriz que obtuvo de NewsFetcher y ganó' se bloquea al eliminar objetos.

+0

¡Esto resolvió mi problema! :) Gracias @pankaj :) –

Cuestiones relacionadas