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.
Ein nsarray ist 0-basiert, also das erste Objekt in ihm hat einen Index von 0, nicht 1. – ughoavgfhw