2011-01-03 9 views
2

i nur ein UILabel als Beispiel so etwas wie diesesWie die Eigenschaft UILabels ändern, die in einem NSMutableArray speichern

tun in Array gehe hinzufügen

NSMutablearray *labels = [[NSMutableArray alloc] init]; 
UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectMake(100,100,20,20)]; 
newLabel.center = CGPointMake(100, 100); 
[labels addObject:newLabel]; 

dann später i newLabel.center möchten, indem Sie sich ändern

[labels objectAtIndex:1].center.x +=10; 

das gibt mir eine Fehlermeldung „Anfrage für Mitglied‚center‘in etwas keine Struktur oder Union“
dann versuche ich

[labels objectAtIndex:1]->center.x +=10; 

dann ich das gibt einen anderen Fehler, sagte struct objc_object hat kein Mitglied ‚Zentrum‘ genannt

wie kann ich die Eigenschaft UILabel ändern, speichert in NSMutableArray ist?

+1

Ein nsarray ist 0-basiert, also das erste Objekt in ihm hat einen Index von 0, nicht 1. – ughoavgfhw

Antwort

8

Sie erhalten diesen Fehler, weil der Rückgabetyp von objectAtIndex: einfach id ist (das ein beliebiges Objekt sein kann); NSArray ist ein generischer Container. Wenn Sie ein Objekt daraus abrufen, können Sie nicht wissen, um welchen Typ es sich handelt. Sie wissen, weil Sie die Objekte in sie einfügen, aber der Compiler weiß es nicht.

Sie schrieb:

[labels objectAtIndex:1].center.x +=10; 

technisch korrekt ist, aber der Compiler nicht geben Sie es überprüfen können. Es ist äquivalent dies zu schreiben:

id object = [labels objectAtIndex:1]; 
object.center.x +=10; 

Die zweite Zeile ist, wo der Fehler auftritt: der Compiler kennt object ein Objective-C-Objekt ist, aber es weiß nicht, welche Klasse, so dass er nicht weiß, was Eigenschaften wurden definiert, usw. Stattdessen versucht es stattdessen, es als Strukturfeldelementzugriff zu analysieren, was nicht der Fall ist, und es schlägt fehl.

Wenn Sie stattdessen schreiben:

UILabel *label = [labels objectAtIndex:1]; 
label.center.x +=10; 

Jetzt ist der Compiler weiß, dass label eine Instanz von UILabel ist, es geht um die Eigenschaftsdefinitionen kennt, und es kann den richtigen Code generieren.

Jetzt haben Sie ein zweites Problem, weil Sie einen Wert innerhalb einer Struktur ändern. Die zweite Zeile oben ist eine Abkürzung für:

label.center.x = label.center.x + 10; 

Dies ist wiederum eine Abkürzung für einen Objective-C Methodenaufruf:

[label center].x = [label center].x + 10; 

Da der Mittelpunkt ist ein CGPoint struct, müssen Sie die get/set Gesamter Punkt Wert auf einmal, Sie können nicht nur das x oder y Mitglied aktualisieren. Also nochmal, Sie müssen es so machen:

UILabel *label = [labels objectAtIndex:1]; 
CGPoint c = label.center; 
c.x += 10; 
label.center = c; 

Das wird tun, was Sie wollen.

Wenn Sie versucht zu sagen, Objective-C ist eine dumme Sprache, weil Sie alle temporären Variablen brauchen ... naja, vielleicht, aber seien Sie fair und verstehen Sie, dass Sie in einem Beispiel zwei Sonderfälle getroffen haben.

+0

auch, beachten Sie, dass das erste Objekt in einem Array Index 0 hat, also sollten Sie sagen: [labels objectAtIndex: 0 ] '. – mohsenr

+0

das beheben mein Problem, vielen Dank – Lingyong

Verwandte Themen