【问题标题】:Setting the frame.size using the dot operator使用点运算符设置 frame.size
【发布时间】:2010-12-13 19:33:33
【问题描述】:

我有一个 UIController,众所周知,UIController 与一个视图相关联,您可以使用合成的 getter 和 setter 方法访问它

UIController controller = init code ..

.. controller.view -> 这给了我我的 UIView 对象,它保留并自动释放,这将是合成的 get 方法(如果我对合成的 getmethod 的理解是正确的)

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

controller.view.frame.size -> CGSize struct

为什么我不能直接给这个框架结构赋值

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

对于上述语句,我收到此错误“需要左值作为赋值的左操作数”

这是一个普通的 c 点运算符,我认为它应该可以工作。如果我遗漏了什么,请赐教

【问题讨论】:

  • 这个问题是我认为在 Objective-C 中不应该引入点语法的第一个原因。它会引起混乱,完全没有必要。
  • "这是一个普通的 c 点运算符" > 不,不是。接收运算符的前两件事是对象,而对象在 C 中不存在。因此,这个 不能 是“正常”的 C 点运算符。 (从技术上讲,前两件事是结构引用,这意味着您想使用箭头 -> 运算符,但随后您将深入研究直接和外部访问实例变量,这是非常糟糕的 )

标签: objective-c


【解决方案1】:

在这种情况下使用点运算符是在幕后使用frame getter 方法。由于 frame 属性是一个 CGRect,它是一个简单的 C 结构,frame 返回值的副本,而不是指向该值的指针。更改它会修改您在堆栈上本地复制的 CGRect,而不是视图的 frame 属性的 CGRect。要更新实际的框架属性,您必须通过 setter 方法 [yourView setFrame:yourNewFrame];yourView.frame = yourNewFrame;

【讨论】:

    【解决方案2】:

    最简单的解决方法是重新设置整个框架

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

    詹姆斯链接中描述了这不能直接工作的原因,它只有吸气剂。

    【讨论】:

      【解决方案3】:

      点语法只是语法糖。

      在这种情况下,这段代码:

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

      其实是这段代码:

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

      用 C 语言来说是这样的:

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

      底线是您不能以这种方式设置函数结果的子字段。即使可以,也不会影响原件,只会影响副本。

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多