2010-02-22 3 views
2

J'ai une question sur les balises pour UIViews. Est-il possible de créer votre propre tag comme myview.tag = "main" ou quelque chose comme ça?Une question sur UIView Mots-objectif c

Je demande parce que mes vues sont créées dans le code et pas avec un fichier nib. Une fois la vue du conteneur chargée et un fichier xml entièrement analysé, je dois pouvoir accéder aux sous-vues et mettre à jour les valeurs.

Après un peu de creuser autour, je lis que l'utilisation viewWithTag serait une bonne façon de le faire

Répondre

4

Oui, vous pouvez le faire dans votre code et il est une technique courante. Toutefois, UIView-tag est un nombre entier. Donc, vous voudrez peut-être enum ou définir quelque chose de lisible par exemple. #define kMySuperViewTag 1 ou enum {kMySuperViewTag, kMyNotSoSuperViewTag, ...};

+0

hey cool, merci. Et comment associer l'onglet à une vue? – dubbeat

+0

myView.tag = kMySuperViewTag; // (en utilisant define ou enums comme expliqué) – Till

+0

mega! Merci beaucoup – dubbeat

0

Vous pouvez stocker des pointeurs dans la propriété tag d'un UIView. Vous devriez le lancer dans un int. Vous devez également savoir à quoi renvoyer la propriété d'étiquette lorsque vous y accédez.

Exemple:

UIView * myView = [[UIView alloc] init]; 

myView.tag = (int)@"main"; 

//Later, you can access the string like so: 

NSString * string = (NSString*)myView.tag; 

//string now points to the string literal @"main". 

Cela échouera probablement avec des pointeurs 64 bits.

+0

C'est la suggestion la plus dangereuse que j'ai jamais vue. Vous voulez encoder 4 octets de chaîne en valeur entière? Ou vous proposez d'utiliser une adresse de pointeur comme balise? Le second signifie fuite de mémoire et probablement - une exception - dépend du compilateur. Le premier - pourquoi ne pas utiliser une grande valeur réelle qui dépassera toutes les sous-vues possibles de superview pour s'assurer qu'il est unique? – ETech

+0

@ "main" est une chaîne littérale et possède une adresse mémoire constante pendant toute la durée du programme en cours d'exécution. Cela ne changera pas, et la chaîne ne sera pas libérée. Ce n'est pas une fuite de mémoire. – cncool

+0

Pointeur tant que l'étiquette est un entier de 32/64 bits. @ "principal" a une adresse mémoire constante. Tu as raison. Dans tous les cas, pourquoi ne pas utiliser un opérateur au niveau du bit, en plaçant 0 au bit de tag le plus petit au lieu d'utiliser l'objet pour la propriété tag qui est NSInteger dans son arrière-plan? Dans votre cas, vous compilez littéral, gardez la mémoire pour cela, utilisez le pointeur vers le littéral. Efficacité? Identique à en discuter) – ETech

2

je pense que vous pouvez aussi utiliser quelque chose comme

myview.layer.name="main"; 

et ce champ est une chaîne