Frage

Ich schaffe eine NSArray mit CGRects die folgende Zeile ein:

[self setMyArray:[NSArray arrayWithObjects:[NSValue valueWithCGRect:CGRectMake(x,y,z,a)], [NSValue valueWithCGRect:CGRectMake(x,y,z,a)], nil]]

ich dann versuchen, die CGrects im Array zu aktualisieren jeder so oft wie folgt aus:

for (NSValue *bound in myArray)
  {
   CGRect myRect = [bound CGRectValue];
   myRect.origin.y += 2;
  }

Dies ist jedoch nicht funktioniert, wenn die Schleife wieder ausgeführt wird, ist der Ursprung immer noch die gleiche. Ich gehe davon aus, das hat etwas mit dem NSValue Wrapper zu tun ?, Was kann ich tun, so dass der Wert tatsächlich in dem Array aktualisiert wird ?. Danke.

-Oscar

War es hilfreich?

Lösung

NSValue Objekte sind unveränderlich, so gibt es nichts, was man tun kann. Sie sollten einen änderbaren Array verwenden und das vorhandene Objekt mit einer neuen NSValue Instanz ersetzen die neue rect enthält.

Andere Tipps

Wie andere erwähnt, NSValue Instanzen sind nicht wandelbar, damit Sie sie neu erstellen müssen, und ersetzen Sie sie dann in einem NSMutableArray.

Eine weitere Option ist mehr ‚klassische‘ C-Speicherverwaltung (malloc / free) zu verwenden und verwalten Sie Ihre Array auf diese Weise. Es ist nichts falsch mit diesem Weg gehen. Sie müssen nur mehr vorsichtig sein, da es hat nicht hoch Niveau wie die Objective-C / Foundation APIs.

// Create an array to hold 100 rectangles
CGRect* rectangles = (CGRect*) malloc(100 * sizeof(CGRect));

// Change the rectangle at index 2 (remember arrays are 0 based, so this is the 3rd)
CGRect* rect = &rectangles[2];
rect->size.width /= 2.0;

// Shortcut for accessing rectangles
rectangles[2].size.width = 100.0;

// Get rid of the array
free(rectangles);

Könnte schneller zu, wenn Sie zum Beispiel auf Arbeit ein Spiel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top