2010-09-28 61 views
2

是否有可能“链接”UILabel文本属性与另一个NSString,以便当这个其他NSString也改变UILabel文本属性更改?UIlabel - 链接文本属性与另一个NSString

例子:

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

回答

5

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

+0

是的,你是对的,我喜欢这个观点与observeValueForKeyPath! – troner 2010-09-28 15:35:17

0

不,你不能。对“文本”的属性定义是: -

@property(nonatomic, copy) NSString *text 

这意味着UILabel的setter方法需要您指定的字符串的副本。如果它没有这样做,你永远不能将一个自动释放的字符串分配给UILabel,因为一旦你分配的原始字符串被释放,标签的文本就会消失或者变得疯狂,并且你最终会负责内存管理UILabel自己的文本,这不会是一个好的情况。

答案是提供一些机制来更新标签的文本,只要您感兴趣的字符串发生变化。正如@Graham Lee指出的那样,这永远不会发生在一个不可变的字符串上,但假设您的源文本在某处变化不定(比如说,比赛分数),那么只要更新标签即可。同样,正如@Graham Lee指出的那样,Cocoa提供了观察员,代表和其他各种方法来使其变得相对容易。

+0

1.“text”属性可以是“retain”而不是“copy”。这不是,特别是你不能在它的脚下改变它。 2.字符串不需要是可变的,它不应该是;你观察物体的属性,而不是物体本身。我不认为NSString是符合KVC的,我不确定你会观察到什么关键路径。 – 2010-09-28 23:27:37

+0

感谢downvote。我们都说同样的事情,除非我强调该属性具有“复制”属性这一事实,并强调数据是不可变的事实。他们都加入了同样的事情:OP有源数据(模型,文本,不管你想调用它),他需要实现某种机制来更新UILabel。 – Echelon 2010-09-29 12:40:19