2010-12-13 21 views
2

J'ai un UIController et comme vous le savez tous UIController est associé à une vue et vous pouvez y accéder en utilisant les méthodes de lecture et setters qui sont synthétisésRéglage du frame.size à l'aide de l'opérateur point

UIController controller = init code .. 

.. controller.view -> cela me donne mon objet UIView qui a conservé et autoreleased, ce sera synthétisé méthode get (le cas échéant ma compréhension synthétisé getMethod est correct)

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

controller.view.frame.size -> CGSize struct 

pourquoi ca nnot j'attribue une valeur directement à cette structure de cadre

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

pour la déclaration ci-dessus je reçois cette erreur « lvalue nécessaire comme opérande gauche d'affectation »

Ceci est un opérateur de point normal c Je pense que cela devrait fonctionner S'il vous plaît éclairer si je manque quelque chose

+0

Cette question est la raison # 1 pourquoi je pense que la syntaxe de point n'aurait jamais dû être introduite dans Objective-C. Cela provoque la confusion et était totalement inutile. –

+0

"Ceci est un opérateur de point c normal"> Non, ce n'est pas le cas. Les deux premières choses qui reçoivent l'opérateur sont des objets, et les objets n'existent pas dans C. Par conséquent, ceci * ne peut pas * être un opérateur de point C "normal". (Techniquement, les deux premières choses structurent les références, ce qui veut dire que vous voudriez utiliser l'opérateur fléché '->', mais vous vous frayez un chemin dans l'accès direct et externe aux variables d'instance, ** QUI EST TRÈS MAUVAIS **) –

Répondre

7

L'utilisation de l'opérateur de point dans cette situation utilise la méthode getter frame en coulisses. Étant donné que la propriété frame est un CGRect, qui est une structure C simple, frame renvoie une copie de la valeur, pas un pointeur sur la valeur. Si vous le modifiez, vous modifiez le CGRect que vous avez copié localement sur la pile, et non le CGRect de la propriété frame de votre vue. Pour mettre à jour la propriété frame réelle, vous devez passer par la méthode setter [yourView setFrame:yourNewFrame]; ou yourView.frame = yourNewFrame;.

1

le plus facile à résoudre c'est de définir le cadre tout nouveau

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

la raison pour laquelle cela ne fonctionne pas est décrite directement lien James, il n'a que getters.

-1

La syntaxe à points est simplement la syntaxe du sucre.

Dans ce cas, ce code:

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

est en fait ce code:

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

En termes C, c'est comme ceci:

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

Bottom line est que vous pouvez Ne définissez pas un sous-champ d'un résultat de fonction de cette façon. Et même si vous le pouviez, cela n'affecterait pas l'original mais seulement une copie.