web-dev-qa-db-fra.com

NSInvalidArgumentException: "Sélecteur non reconnu envoyé à une instance"

Je suis confronté à un problème dont je ne comprends pas vraiment la raison. L'exception ne me donne pas la moindre idée de comprendre le problème.

Je souhaite modifier le contenu de UILabel sur mon interface en fonction des données fournies dans myArray. Cependant, comme la ligne que j'ai spécifiée dans la fonction "cellForRowAtIndexPath", le programme déclenche une exception.

Quelle est la raison de ce problème?

@property (strong, nonatomic) NSMutableArray *myArray; //

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [myArray addObject:@{@"field1": @"myfield1"}]
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger) section {
    return self.myArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    // Configure the cell...
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    UILabel *myLabel = (UILabel *)[cell viewWithTag:100]; // myLabel is successfully created with the given viewWithTag 
    NSLog(@"Object at indexpath.row: %ld", (long)indexPath.row); // Object at indexpath.row: 0
    NSLog(@"The obj of the array = %@",[self.myArray objectAtIndex:indexPath.row] ); // The obj of the array = {field1: @"myfield1"}

    myLabel.text = [[self.myArray objectAtIndex:indexPath.row] objectForKey:@"field1"]; // this part fires the exception given below.

    return cell;
}

//getter for myArray
-(NSMutableArray *)myArray{
    if(! _myArray){
        _myArray = [[NSMutableArray alloc] init];
    }
    return _myArray;
}

L'erreur:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x1459d1f0'
9
ankakusu

Plutôt que de vous dire quoi changer votre code, je vais vous donner quelques conseils afin que vous puissiez, espérons-le, résoudre vos problèmes un peu plus facilement à l'avenir.

Tout d'abord, le message d'erreur que vous avez est ceci

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x1459d1f0'

Le message d'exception est le point clé ici

unrecognized selector sent to instance

Si vous recherchez ce message à l'aide du moteur de recherche de votre choix, vous verrez que cela signifie que vous appelez une méthode sur un objet qui ne répond pas à cette méthode. Le message d'erreur vous indique également la méthode que vous essayez d'appeler et sur quel type d'objet vous l'appelez.

[__NSCFArray objectForKey:]

Si vous consultez la documentation de l'objet NSArray, vous verrez qu'il n'y a pas de méthode objectForKey disponible pour cela.

Ce que vous devez maintenant faire est de définir un point d'arrêt dans votre code (si vous ne connaissez pas les points d'arrêt, lisez-les et lisez-les - ils sont IMPORTANT pour le débogage) et continuez jusqu'à ce que vous atteigniez la ligne qui lève l'exception. À ce stade, vous pouvez inspecter les objets que vous avez et voir quels sont leurs types. Vous devriez alors pouvoir déterminer ce que vous devriez faire avec le codage.

31
Nick Bull

[__NSCFArray objectForKey:]: sélecteur non reconnu envoyé à l'instance 0x1459d1f0 '

Vous ne pouvez pas appeler objectForKey pour NSMutableArray Peut-être devriez-vous utiliser NSDictionary si vous devez utiliser objectForKey: Vous pouvez également utiliser un tableau de tableaux Ex:

NSArray *array = [[NSArray alloc] initWithObjects:@"field1Value",@"field2Value",@"field3Value",nil];

[self.myArray addObject:array];

Maintenant, lorsque vous avez besoin de récupérer une valeur de champ, appelez simplement l’index dans le tableau

NSArray *array = [self.myArray objectAtIndex:[indexPath row]];
NSString* valueField1 =[array objectAtIndex:0];

J'espère que ça va aider :)

Edit: Si vous devez utiliser NSDictionary

    self.myArray=[[NSMutableArray alloc]init];
    dict=[[NSDictionary alloc] initWithObjectsAndKeys:@"value",@"KeyName",nil];
    [self.myArray addObject:dict]; 
    myLabel.text = [[self.myArray objectAtIndex:indexPath.row] objectForKey:@"KeyName"];
2
Iphone User

L'exception ne me donne pas la moindre idée de comprendre le problème.

Je ne suis pas d'accord, l'exception vous dit exactement ce que vous avez fait de mal. Il vous indique que vous avez envoyé objectForKey: à un tableau plutôt qu'à un dictionnaire. La seule ligne où je vous vois en utilisant objectForKey: est celle-ci.

myLabel.text = [[self.myArray objectAtIndex:indexPath.row] objectForKey:@"field1"]; 

ce qui signifie que [self.myArray objectAtIndex:indexPath.row] est un tableau, pas un dictionnaire. Je ne sais pas comment cela s'est passé parce que nulle part dans votre code que vous nous montrez, il n'y a rien qui ajoute un objet à self.myArray. En particulier, cela ne:

[myArray addObject:@{@"field1": @"myfield1"}]

Il devrait dire

[self.myArray addObject:@{@"field1": @"myfield1"}];

J'imagine que c'était juste une erreur de copie parce que vous avez également oublié le point-virgule. Notez que le fait de mettre un trait de soulignement à l’avant de myArray n’est pas bon, car vous dépendez de l’accesseur pour initialiser le tableau.

0
JeremyP

Si vous stockez NSDictionary ou NSMutableDictionary dans array, alors le code fonctionnera pour vous. Si vous souhaitez ajouter NSDictionary à un tableau, vous devez utiliser: [[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil]

0