【问题标题】:UIlabel - link text property with another NSStringUIlabel - 将文本属性与另一个 NSString 链接
【发布时间】:2010-09-28 15:24:52
【问题描述】:

是否可以将 UILabel 文本属性与另一个 NSString “链接”,这样当另一个 NSString 更改时,UILabel 文本属性也会更改?

例子:

UILabel *label = [[UILabel alloc] init];  
NSString *str = @"labelText1";  
label.text = str;  
str = @"labelText2"; //after this assignment label.text is still "labelText1"

【问题讨论】:

    标签: iphone cocoa-touch uilabel


    【解决方案1】:

    在您的问题中,您没有“更改”任何对象-NSString 实例是不可变的,并且您刚刚说过某些变量指向一个实例而不是另一个实例。假设您的字符串确实是某个其他模型对象的属性,您可以让控制器观察该属性(使用-observeValueForKeyPath:ofObject:change:context)并在每次看到更改时更新标签。

    【讨论】:

    • 是的,你是对的,我喜欢 observeValueForKeyPath 的想法!
    【解决方案2】:

    不,你不能。 'text' 的属性定义是:-

    @property(nonatomic, copy) NSString *text
    

    这意味着 UILabel 的 setter 方法获取您分配的字符串的副本。如果它不这样做,您将永远无法将自动释放的字符串分配给 UILabel,因为一旦您分配的原始字符串被解除分配,标签的文本就会消失或发疯,并且您最终将负责内存管理UILabel 自己的文本,这不是一个好情况。

    答案是提供一些机制来在您感兴趣的字符串发生变化时更新标签的文本。正如@Graham Lee 指出的那样,这永远不会发生在不可变的字符串中,但是假设您的源文本在某处发生了可变的变化(例如游戏分数),那么您应该在发生这种情况时简单地更新标签。同样,正如@Graham Lee 指出的那样,Cocoa 提供了观察者、代表和各种其他方法来使这相对容易。

    【讨论】:

    • 1. “text”属性可以是retain 而不是copy。它不是,特别是你不能在它的脚下改变这个字符串。 2.字符串不需要是可变的,也不应该是;你观察对象的属性,而不是对象本身。我认为 NSString 不符合 KVC,而且我不确定您会观察哪些关键路径。
    • 感谢您的反对。我们都在说同样的事情,除了我强调属性具有“复制”属性的事实,而您强调数据是不可变的事实。它们加起来是同一件事:OP 的源数据(模型、文本,无论你想怎么称呼它)都会发生变化,他需要实现某种机制来更新 UILabel。
    猜你喜欢
    • 2011-11-06
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多