2013-01-16 22 views
14

Ich muss überprüfen, ob ein bestimmtes Array ein bestimmtes Objekt enthält, und wenn dies der Fall ist, löschen Sie das Objekt. Wenn es dieses Objekt nicht hat, ist es die Funktion, es dem Array hinzuzufügen. Das Problem besteht darin, dass das Objekt immer hinzugefügt wird, weil die Prüfanweisung immer false zurückgibt.Überprüfen, ob ein Array ein bestimmtes Objekt (iOS) enthält

Hier ist meine aktuelle Funktion:

- (void) myFunction:(NSString *)parameter { 

    if (![myMutableArray containsObject:parameter]) { 

     [myMutableArray addObject:parameter]; 
     NSLog(@"%@ added", parameter); 

    } else { 

     [myMutableArray removeObject:parameter]; 
     NSLog(@"%@ deleted", parameter); 

    } 
} 
+1

Ich vermute, dass Sie das gleiche Problem haben wie in dieser Frage gelöst wurde: http://stackoverflow.com/questions/2941596/nsarray-containobjects-method –

+0

Ist das Array rein ein Array von NSString-Objekten? –

+0

Was passiert, wenn Sie Ihre Methode zweimal mit demselben Parameter aufrufen? –

Antwort

30

containsObject isEqual in den Arrays auf jeder des Objekts aufruft. Für welche Art von Objekt suchen Sie? Wenn es ein benutzerdefiniertes Objekt ist, überschreiben und implementieren Sie die Methode isEqual.

Ich vermute, Sie versuchen, den Wert des Objekts zu überprüfen, aber ContainsObject ruft tatsächlich IsEqual, die den Verweis auf das Objekt vergleicht, und nicht seinen tatsächlichen Wert.

2

Sie sollten isEqual: in Ihrer benutzerdefinierten Klasse implementieren. Standardmäßig sind zwei Objekte nur dann identisch, wenn sie denselben Bezug haben.

Stellen Sie außerdem sicher, dass Sie Ihr veränderbares Array vor der Verwendung initialisieren.

EDIT:

Es scheint, dass Variablennamen Ihres Arrays werden höchstwahrscheinlich falsch eingegeben.

  • myMutableArray
  • myMutbaleArray
+1

Natürlich ist seine "benutzerdefinierte Klasse" angeblich ein NSString. –

+0

Es ist keine benutzerdefinierte Klasse, es ist ein NSString – mprivat

1

Sie haben vergessen, wahrscheinlich Ihre NSMutableArray zu initialisieren. Wenn nicht initialisiert, senden Sie addObject Nachrichten an einen nil Objekt, das keine Wirkung zeigt, und das Array enthält nie, was Sie zuvor hinzugefügt ...

Natürlich, wenn das Array nil ist, dann ist die contains Prüfung wird immer falsch zurückgeben. Nach der Objective-C-Dokumentation:

Wenn die Methode gibt ein Objekt, jeden Zeigertyp, einen beliebigen ganzen Zahl skalare einer Größe von weniger als oder gleich sizeof (void *), ein Schwimmer, ein doppelten, ein langen Doppel-, oder eine lange, lange, dann wird eine Nachricht an nil sandten 0.

und 0 ist falsch

7

Zuerst müssen Sie prüfen, welche Art von Daten oder Objekt Sie in diesem myMutableArray hinzufügen. Entsprechend Ihrer Methode überprüfen Sie veränderbares Array für den Stringtyp, den Sie das Argument parameter übergeben haben. Es ist möglich, dass Sie das Array int oder float enthalten.

Möglicherweise gibt es in Ihrem Array ein Problem mit dem Typ-Casting. Wenn Sie vom Datentyp STRING sind, können Sie eine andere Methode wie diese verwenden.

- (void) myFunction:(NSString *)parameter { 

for (int i = 0 ; i < [myMutableArray count ] ; i++) { 


    if (![[myMutableArray objectAtIndex:i] isEqualToString:parameter]) { 
     [myMutableArray addObject:parameter]; 
     NSLog(@"%@ added", parameter); 
    } 
    else{ 
     [myMutableArray removeObject:parameter]; 
     NSLog(@"%@ deleted", parameter); 
    } 
} 

}

Hope this Ihnen helfen. Wenn Ihr Objekt kein NSString-Typ ist, müssen Sie es konvertieren.

+0

Hat mir sehr geholfen, danke nirav –

16
if (![arrList containsObject:arrObj]) { 
    // do something 
} 

containsObject:

Verwandte Themen