2010-09-28 5 views
2

Est-il possible de "lier" la propriété de texte UILabel avec un autre NSString de sorte que lorsque cette autre NSString est modifiée, la propriété de texte UILabel change également?UIlabel - propriété de lien de texte avec un autre NSString

Exemple:

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

Répondre

5

Dans votre question, vous ne l'avez pas « changé » tout objet - NSString instances sont immuables, et vous venez de dire que certains points variables à une instance au lieu d'un autre. En supposant que votre chaîne est réellement une propriété d'un autre objet modèle, vous pouvez demander à votre contrôleur d'observer cette propriété (avec -observeValueForKeyPath:ofObject:change:context) et de mettre à jour l'étiquette chaque fois qu'il voit un changement.

+0

Oui, vous avez raison et j'aime l'idée avec observerValueForKeyPath! – troner

0

Non, vous ne pouvez pas. La définition de la propriété pour « texte » est: -

@property(nonatomic, copy) NSString *text 

qui signifie la méthode setter de la UILabel prend une copie de la chaîne que vous attribuez. Si ce n'était pas le cas, vous ne pourriez jamais assigner une chaîne auto-libérée à un UILabel, car le texte de l'étiquette disparaîtrait ou deviendrait fou une fois que la chaîne d'origine que vous avez assignée serait désaffectée, et vous seriez responsable de la gestion de la mémoire. Le propre texte d'UILabel, ce qui ne serait pas une bonne situation.

La réponse est de fournir un mécanisme pour mettre à jour le texte de l'étiquette chaque fois que la chaîne qui vous intéresse change. Comme l'a souligné @Graham Lee, cela ne peut jamais arriver avec une chaîne immuable, mais en supposant que votre texte source change mutuellement quelque part (un score de jeu, par exemple), vous devriez simplement mettre à jour l'étiquette chaque fois que cela arrive. Encore une fois, comme l'a souligné @Graham Lee, Cocoa fournit des observateurs, des délégués et diverses autres méthodes pour rendre cela relativement facile.

+0

1. La propriété "text" pourrait être 'retain' au lieu de' copy'. Ce n'est pas le cas, en particulier si vous ne pouvez pas muter la tringule sous ses pieds. 2. La chaîne n'a pas besoin d'être mutable, et elle ne devrait pas être; vous observez les propriétés des objets, pas les objets eux-mêmes. Je ne pense pas que NSString soit conforme à KVC, et je ne suis pas sûr des chemins clés que vous observeriez. –

+0

Merci pour la rétrogradation. Nous disons tous les deux la même chose, sauf que j'insiste sur le fait que la propriété a un attribut «copie», et vous insistez sur le fait que les données sont immuables. Ils ajoutent tous les deux la même chose: l'OP a des données source (modèle, texte, peu importe comment vous voulez l'appeler) qui changent, et il a besoin d'implémenter un mécanisme pour mettre UILabel à jour. – Echelon

Questions connexes