2012-08-26 4 views
11

Diese Frage ist kein "Wie mache ich", sondern ein "Warum ist das" bezüglich einiger Klasseneigenschaften in Objective-C.Warum ist "Ausdruck nicht zuweisbar" (UIView.frame.origin)?

Ich verstehe, dass die beiden folgenden Beispiele werden in einem Fehler („Ausdruck nicht übertragbar“) nicht erlaubt und führen:

self.myUIView.frame.origin.x = 50; 
self.myUIView.frame.origin = CGPointMake(50,50); 

und dass der richtige Weg, dies zu tun, ist eine neue CGRect zu schaffen, stellen sie die gewünschten Werte und dann zuweisen:

CGRect rect = self.myUIView.frame; 
rect.origin = CGPointMake(50, 50); 
self.myUIView.frame = rect; 

ich möchte verstehen, warum dies so ist.

CGRect ist eine Struktur, die zwei Strukturen enthält. Hat die Einschränkung damit zu tun, wie Strukturen zugewiesen werden, um eine Zuweisung zu verhindern, die diesen Speicher überläuft? Oder ist es eher eine Konvention über öffentliche und private Grundstücke?

Ich weiß, das scheint eine kleine/grundlegende Frage zu sein, aber ich denke, es ist wichtig, schlammiges/schlechtes Verständnis dieser grundlegenden Dinge aufzuklären.

Antwort

9

Wenn Sie den Ursprung oder die Größe eines Frames direkt ändern konnten, würden Sie die Setter-Methode der UIView-Frame-Eigenschaft umgehen. Dies wäre aus mehreren Gründen schlecht.

UIView hätte keine Chance, über Änderungen an seinem Frame benachrichtigt zu werden. Aber es muss über diese Änderungen Bescheid wissen, um die Subviews aktualisieren oder neu zeichnen zu können.

Auch für KVO zu arbeiten, müssen Sie die richtigen Setter verwenden (entweder mit SetFrame: oder die Punktnotation).

5

Das Problem mit den Elementen der struct Zuordnung besteht darin, dass die Klasse die struct besitzen wird keine Ahnung haben, die struct wurde geändert. Dies ist nicht gut, wenn Sie beispielsweise über den Ursprung eines Rahmens sprechen: UIView wird erwartet, als Reaktion auf die Änderung des Ursprungs zu verschieben, aber da die Klasse nicht über die Änderung benachrichtigt würde, würde keine Bewegung auftreten.

Die Einstellung frame kann dagegen erkannt werden, weil UIView 's setFrame Methode aufgerufen werden würde. Dies ist der Code, in dem UIView die Größenanpassung, Neupositionierung usw. übernehmen kann.

Verwandte Themen