2010-12-13 11 views
2

Ich habe einen UIController und wie Sie alle wissen UIController ist mit einer Ansicht zugeordnet und Sie darauf zugreifen können, die Getter und Setter Methoden, dieEinstellen des frame.size mit dem Punktoperator

UIController controller = init code .. 

synthetisiert werden .. controller.view -> das gibt mir mein UIView Objekt, das beibehalten und Autoreleased, wird diese Methode get synthetisiert werden

controller.view.frame -> this gives me my CGRect struct 

controller.view.frame.size -> CGSize struct 

(Wenn überhaupt mein synthetisierten GetMethod Verständnis korrekt ist), warum ca nnot ich einen Wert zuweisen direkt zu dieser Rahmenstruktur

controller.view.frame.size.width = 20; 

für die obige Aussage, die ich diesen Fehler „L-Wert als linker Operand Zuordnung erforderlich“

Dies ist ein normaler c Punkt-Operator ich denke, es sollte funktionieren .Bitte erleuchten, wenn ich etwas vermisse

+0

Diese Frage ist der Grund, warum ich denke, dass die Punktsyntax in Objective-C niemals eingeführt worden sein sollte. Es verursacht Verwirrung und war völlig unnötig. –

+0

"Dies ist ein normaler c-Punkt-Operator"> Nein, ist es nicht. Die ersten beiden Dinge, die den Operator erhalten, sind Objekte, und in C existieren keine Objekte. Daher kann * * kein "normaler" C-Punktoperator sein. (Technisch gesehen, die ersten beiden Dinge, die struct referenziert, was bedeutet, dass Sie den Pfeil '->' operator verwenden möchten, aber dann untersuchen Sie direkt und extern Zugriff auf Instanzvariablen, ** DAS IST SEHR SCHLECHT **) –

Antwort

7

Verwenden Sie den Punkt-Operator in dieser Situation ist die Verwendung der frame Getter-Methode hinter den Kulissen. Da die Frame-Eigenschaft eine CGRect ist, die eine einfache C-Struktur ist, gibt frame Ihnen eine Kopie des Werts zurück, keinen Zeiger auf den Wert. Durch das Ändern wird das CGRect geändert, das Sie lokal auf dem Stack kopiert haben, nicht das CGRect der Frame-Eigenschaft Ihrer Ansicht. Um die tatsächliche Rahmeneigenschaft zu aktualisieren, müssen Sie die Setzermethode [yourView setFrame:yourNewFrame]; oder yourView.frame = yourNewFrame; durchlaufen.

1

die einfachste, das zu lösen ist der gesamte Rahmen

controller.view.frame = CGRectMake(controller.view.frame.origin.x, controller.view.frame.origin.y, 20, controller.view.frame.size.height); 

den Grund wieder zu setzen, warum dies nicht funktioniert direkt in James Link beschrieben wird, hat es nur Getter.

-1

Dot-Syntax ist nur Syntax Zucker.

In diesem Fall dieser Code:

controller.view.frame.size.width = 20; 

Ist eigentlich dieser Code:

[[controller view] frame].size.width = 20; 

In C Begriffe, die wie folgt ist:

ViewGetFrame(ControllerGetView(controller)).size.width = 20; 

Unterm Strich ist, können Sie Stellen Sie auf diese Weise kein Unterfeld einer Funktion ein. Und selbst wenn Sie könnten, würde das Original nicht beeinflussen, sondern nur eine Kopie.

Verwandte Themen