Tous les objets qui dérivent de <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView">UIView</a> héritent des propriétés utiles <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW25">tag</a> Cette propriété est un véritable utilisateur de données (une «place» que le développeur utilise à des fins générales) de type <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/Reference/reference.html#//apple_ref/doc/c_ref/NSInteger">NSInteger</a> Alors, où nous pouvons stocker que des nombres.
Les usages auxquels ils peuvent dépend évidemment des circonstances cependant, il est utile d'identifier un objet en particulier de prendre une occurrence commune. Par exemple, imaginez que vous avez deux <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIAlertView_Class/UIAlertView/UIAlertView.html">UIAlertView</a> répondre à un même événement:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | / / Première alerte [ [ UIAlertView alloc ] initWithTitle : @ "Primo" message : @ "Primo Alert" delegate : self cancelButtonTitle : @ "OK" otherButtonTitles : nil , nil ] ; UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ "Première" message: @ "First Alert" délégué: cancelButtonTitle auto: @ "OK" otherButtonTitles: néant, de néant]; ; [Alerte] montrent; ; [Communiqué Alerte]; / / ... / / Alert deuxième [ [ UIAlertView alloc ] initWithTitle : @ "Secondo" message : @ "Secondo Alert" delegate : self cancelButtonTitle : @ "OK" otherButtonTitles : nil , nil ] ; UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ "deuxième" message: @ "deuxième alerte« délégué: cancelButtonTitle auto: @ "OK" otherButtonTitles: néant, de néant]; ; [Alerte] montrent; ; [Communiqué Alerte]; / / Événement / / Cliccandi bouton OK de cette fonction sera appelée Alter void ) alertView : ( UIAlertView * ) alertView clickedButtonAtIndex : ( NSInteger ) buttonIndex { - (Void) alertView: (UIAlertView *) clickedButtonAtIndex alertView: (NSInteger) {buttonIndex / / TODO } |
Remarque: les exemples de code en C + +, vous trouverez les directions. Ce n'est pas tout à fait correcte, car, comme vous le savez, le langage est Objective-C. Cela est dû au fait que les plugins que j'utilise pour afficher le code source ne supporte pas l'Objective-C et C + + est celui qui s'approche de lui le meilleur.
Comment faire la différence entre l'alerte deux? Précisément en utilisant la balise de propriété. Après la création du alert suffit d'entrer:
1 2 3 4 5 6 7 8 9 10 11 12 13 | / / Première alerte [ [ UIAlertView alloc ] initWithTitle : @ "Primo" message : @ "Primo Alert" delegate : self cancelButtonTitle : @ "OK" otherButtonTitles : nil , nil ] ; UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ "Première" message: @ "First Alert" délégué: cancelButtonTitle auto: @ "OK" otherButtonTitles: néant, de néant]; 1 ] ; // imposto il tag di questo Alert ad 1 [MISE alerte: 1] / / Définit le tag de cette Alerte à 1 ; [Alerte] montrent; ; [Communiqué Alerte]; / / ... / / Alert deuxième [ [ UIAlertView alloc ] initWithTitle : @ "Secondo" message : @ "Secondo Alert" delegate : self cancelButtonTitle : @ "OK" otherButtonTitles : nil , nil ] ; UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ "deuxième" message: @ "deuxième alerte« délégué: cancelButtonTitle auto: @ "OK" otherButtonTitles: néant, de néant]; 2 ] ; // imposto il tag di questo Alert ad 2 [MISE Alerte: 2] / / Définit le tag de cette Alerte à 2 ; [Alerte] montrent; ; [Communiqué Alerte]; |
Maintenant modifier l'événement afin de comprendre ce qui alerte a été fermée:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | / / Événement / / Cliccandi bouton OK de cette fonction sera appelée Alter void ) alertView : ( UIAlertView * ) alertView clickedButtonAtIndex : ( NSInteger ) buttonIndex { - (Void) alertView: (UIAlertView *) clickedButtonAtIndex alertView: (NSInteger) {buttonIndex alertView.tag ) { switch (alertView.tag) { : cas 1: / / First Alert break; : cas 2: / / Selon alerte break; par défaut: break; } } |
Exact même technique peut être utilisée que si nous avons une série de <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html">UIButton</a> run-time. Par exemple:
1 2 3 4 5 6 7 8 9 10 | unsigned int i = 0 ; i < 10 ; i ++ ) { for (unsigned int i = 0; i <10; i + +) { [ [ UIButton buttonWithType : UIButtonTypeCustom ] initWithFrame : CGRectMake ( i * 20 , i * 20 , 20 , 20 ) ] ; UIButton * myButton = [[UIButton buttonWithType: UIButtonTypeCustom] initWithFrame: CGRectMake (i * 20, * 20, 20, 20)]; @ "But" forState : UIControlStateNormal ] ; [MyButton setTitle: @ "Mais", Forst: UIControlStateNormal]; i ] ; // imposto il tag [MISE MyButton: i]; / / Définit le tag / / Le même événement pour tous self action : @selector ( onTouchUpInside : ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget MyButton: action d'auto: @ selector (onTouchUpInside:) forControlEvents: UIControlEventTouchUpInside]; mybutton ] ; [Self.view addSubview: myButton]; } |
(dove eseguiamo un casting <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView">UIView</a> Dans le cas onTouchUpInside récupérer de l' sender (où nous effectuons une coulée <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView">UIView</a> la propriété <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW25">tag</a>
1 2 3 4 | void ) onTouchUpInside : ( id ) sender { - (Void) onTouchUpInside: (id) sender { ( ( UIView * ) sender ) .tag; unsigned int button_tag = ((UIView *) sender) tags.; / / TODO } |










. Vous ne devez pas abuser de la balise propriétés (évidemment ce n'est pas le cas) quand vous êtes dans des situations où la vue est la structure beaucoup, de sorte que x sous-vue, que cette liste est maintenue avec un
NSArray, c'est scanné afin de trouver cetag.le
subview) Si la recherche est effectuée en comparant la valeur numériquetagséquentielle (et je ne pense pas que ce n'est pas fait d'une autre manière, l'ordre maximum en interne pourtagde lasubview)objectatindexn'est pas vraiment bien mais j'ai mis pour la simplicité de comprendre la sémantique.2
3
4
5
self.subviews.objectatindex ( i ) .tag == tagrichiesto ) { if (self.subviews.objectatindex (s). tagrichiesto == tag) {
i ) ; retour self.subviews.objectatindex (s);
}
}
1) dans le meilleur des cas l'
tagla première donc nous avons fait une comparaison2) dans une affaire contre la médiane, nous avons n
3) dans le pire des cas, il n'existe pas, nous avons effectué pour chaque itération x contre les inutiles
ipotizzando il caso peggiore del non trovato: avremo effettuato 100*10=1000 confronti inutili, per non parlare di invocazioni in cascata all'array subview e ai vari metodi di analisi). Il est souvent utilisé pour accéder à des cellules du tableau, et dans cette situation, où nous avons des centaines de lignes avec x
subviewpar ligne qui a le plus de déchets (si vous êtes 100 cellules avec chacun 10subviewsen supposant le pire cas de non trouvée: nous fait 100 * 10 = 1000 comparaisons inutiles, pour ne pas mentionner le tableau des invocations en cascade sous-vue et les différentes méthodes d'analyse).visto che confrontiamo gli indirizzi fisici dei due oggetti (più veloce di così non si può). J'ai oublié ... dans certaines situations, il pourrait être souhaitable d'utiliser un
iboutletsi nous utilisons IB (Interface Builder) ou avoir un ensemble de propriétés associées à ces objets, à laquelle nous pouvons accéder directement à partir de n'importe quelle méthode de notre classe, si la comparaison est un objet ou d'une autre dans ce cas peut être fait simplement en utilisant l'opérateur==Puisque nous comparons les adresses physiques des deux objets (plus rapide si vous ne pouvez pas).per evitare di aggiungere variabili locali. Dans l'exemple montré est très bien, bien sûr, éventuellement faire une comparaison entre «l'ensemble» au sein de l'
switch, mais j'ai vu l'utilisation de nombreux / abus detagpour éviter d'ajouter des variables locales.une bonne planification