【问题标题】:Two lines of code that are saying the same thing?两行代码在说同样的事情?
【发布时间】:2016-07-17 11:02:14
【问题描述】:

我在一本书中进行了这个练习,并且有一次,有一个方法的实现可以创建随机放置在视图中的标签。代码如下:

 1   - (void)drawHypnoticMessage:(NSString *)message{
 2       for(int i =0; i<20; i++){
 3           UILabel *messageLabel = [[UILabel alloc] init];

 4           messageLabel.backgroundColor = [UIColor clearColor];
 5           messageLabel.textColor = [UIColor whiteColor];
 6           messageLabel.text = message;
 7           [messageLabel sizeToFit];

 8           int width = self.view.bounds.size.width - messageLabel.bounds.size.width;
 9           int randomX = arc4random() % width;
 10          int height = self.view.bounds.size.height - messageLabel.bounds.size.height;
 11          int randomY = arc4random() % height;

 12          CGRect frame = messageLabel.frame;
 13          frame.origin = CGPointMake(randomX, randomY);
 14          messageLabel.frame = frame;

 15         [self.view addSubview:messageLabel];
 16      }
 17  }

这很好用。我的问题是关于第 12 行和第 14 行。当我将这个练习从书中复制到 Xcode 并到达第 12 行时,我本能地将其更改为:

12   CGRect frame;

这不起作用,我不明白为什么。对我来说,第 12 行和第 14 行:

12   CGRect frame = messageLabel.frame;

14   messageLabel.frame = frame;

肯定是在说同一件事两次。谁能解释一下为什么不是这样?

【问题讨论】:

  • 我想你必须明白的是,= 在这种情况下意味着赋值。它不代表相等(就像在某些语言的 IF 语句中那样)。所以这里A=B和B=A的意思不一样,第13行在重新分配frame之前调整了内部值

标签: objective-c frame cgrect repeat


【解决方案1】:

Objective-C 重载 C 的结构成员访问运算符 (.) 以访问 Objective-C 对象的属性。问题是你不能在一个赋值语句中混合两者,因为编译器的解析器会混淆。

messageLabel 是一个具有名为frame 的属性的对象。 frame 是一个有两个成员的结构:originsize

要绕过这个限制,你需要使用一个临时变量来保存结构体(例如frame),操作这个副本(结构体在赋值时被复制),然后将新结构体(frame)分配给属性,它会更新属性的值。

【讨论】:

    【解决方案2】:

    您正在修改第 13 行中的框架,即更改原点值。这本书向您展示了一种更改框架的常用技术,因为您无法自行更改点或大小值。

    【讨论】:

    • 对不起,我不明白这一点。你是说通过改变框架的原点(在第 13 行)以某种方式停止框架 = 到 messageLabel.frame??
    • 是的,您创建一个新的“框架”,其值为 messageLabel 的框架,然后您更改这个新的“框架”并让您的 messageLabel 显示此更改,您将您的 messageLabel 框架分配给这个新的框架。你可以用这行代码实现同样的效果,“messageLabel.frame = CGRectMake(randomX, randomY, messageLabel.frame.size.width, messageLabel.frame.size.height);”
    猜你喜欢
    • 1970-01-01
    • 2022-10-15
    • 2023-03-27
    • 2018-06-04
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多