2010-09-28 55 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