2010-03-22 6 views
20

Ich habe eine MVC-Anwendung. Das Modell hat eine Eigenschaft, die eine Struktur NSSize ist. Es ist beschreibbar wie folgt aus:Wie macht NSValue seine Magie?

- (void)setSize:(NSSize)aSize; 

Der Blick dieses setzt NSSize Schlüssel-Wert-Codierung verwenden. Sie können jedoch nicht Schlüssel-Wert-Code eine Struktur, so dass ich wickelte es in ein NSValue -Objekt wie folgt aus:

[theView setValue:[NSValue valueWithSize:mySize] 
      forKey:@"theModel.size"]; 

Zu meinem Verständnis, sollte dies nicht funktionieren, da die Zugriffs eine Struktur erwartet und nicht eine NSValue . Aber es funktioniert perfekt. Magisch.

Wie ist das möglich?

+1

+1 das ist eine gute Frage, denn Schlüssel-Wert-Codierung ist eine der wirklich * tollen * Dinge über die Cocoa-Frameworks. Auch +1 für das "magische" Tag! –

Antwort

12

Scrollen Sie zu „Wrapping and Unwrapping Structs“, aber hier ist das Wesentliches:

setValue:forKey: bestimmt den Datentyp durch die entsprechenden Zugriffs oder Instanzvariable für den angegebenen Schlüssel erforderlich. Wenn der Datentyp kein Objekt ist, wird der Wert mit der entsprechenden Methode -<type>Value aus dem übergebenen Objekt extrahiert.

BTW, danke für das Stellen dieser Frage! Dies ist einer dieser Kakaosachen, der immer "nur funktioniert hat" und ich habe nie gedacht, dass es nicht offensichtlich ist, wie er erreicht wurde.

+0

Gern geschehen. Ehrlich gesagt, es hat mich umgehauen, als das plötzlich "nur funktioniert". – bastibe