concatenation de mon compteur au nom de variable

StephSteph Membre
00:00 modifié dans API UIKit #1
Salut,

J'ai une série d'outlet, img1 à  6, et j'aimerai faire un set des images dans une boucle (j'ai plusieurs page etc, ça va être long à  faire à  la main), donc je cherche à  faire un

for (int i=1; i &lt; 7; i++) {<br />&nbsp; &nbsp; mavue.monOutlet+i.image = monImage;<br />}<br />

C'est possible ?

Merci :D

Réponses

  • DrakenDraken Membre
    00:00 modifié #2
    Euh .. pas la moindre idée.

    Si je comprend bien, tu veux référencer tes images par un indice. Pourquoi ne pas les stocker dans un NSMutableArray ?

  • CéroceCéroce Membre, Modérateur
    mai 2011 modifié #3
    Key-Value Coding.

    NSString *outletName = [NSString stringWithFormat:@&quot;monOutlet%i&quot;, i];<br />UIImageView *outlet = [self valueForKey:outletName];<br />outlet.image = monImage;
    


    Utiliser un NSArray est toutefois une meilleure idée sur le moyen terme, quand la classe évoluera. Le KVC est résolu à  l'exécution, alors que mettre des outlets qui n'existeraient plus dans un NSArray se voit à  la compilation.
  • StephSteph Membre
    00:00 modifié #4
    Ok, je vais regarder les deux solutions alors :)

    Merci beaucoup !
  • AliGatorAliGator Membre, Modérateur
    mai 2011 modifié #5
    1) Tu peux utiliser IBOutletCollection au lieu de IBOutlet, c'est un nouveau mot clé (depuis le SDK 4.x je crois) qui permet de déclarer un NSArray d'IBOutlet. Le principe est simple, tu déclares
    @property (nonatomic, retain) IBOutletCollection(UIImageView) NSArray* imageViews;
    
    Et dans IB tu vas voir un outlet "imageViews" apparaà®tre, sauf que contrairement à  un IBOutlet classique, tu vas pouvoir y relier plusieurs objets (de type UIImageView) et pas seulement un. Chaque objet ainsi relié dans IB va se retrouver dans le NSArray imageViews au final.
    Inconvénient : le tableau n'est pas ordonné. Il n'y a pas de corrélation entre l'ordre dans lequel tu as connecté tes UIImageViews à  l'outlet dans IB et l'ordre dans lequels ces objets se retrouveront dans ton NSArray. Du coup c'est bien pour itérer sur toutes tes UIImageViews, mais tu ne pourras pas les différencier et les traiter de façon isolée (si tu cherches à  un moment à  ne changer l'image que d'une seule de tes 6 UIImageViews par exemple, pas de possibilité de savoir laquelle correspond à  celle que tu cherches)

    2) Tu peux utiliser le KVC, comme proposé par Céroce

    3) Tu peux utiliser les tags des views et viewWithTag ensuite pour les récupérer.
    Par exemple tu affectes à  tes UIImageViews la valeur 1000+i à  chacune, i allant donc de 1 à  6. Et comme ca c'est facile de boucler dessus en récupérant viewWithTag:1000+i

    4) Tu peux mixer le tout (IBOutletCollection pour tes boucles + tags pour accès individuel

    5) Tu peux créer un NSArray contenant tes 6 images (mais ça veut dire qu'il faut que tu le remplisses au runtime dans ton viewDidLoad par exemple

    6) Tu peux (plus simple) utiliser un tableau C :
    #define kImageViewsCount 6<br />UIImageView* imageViews[kImageViewsCount] = {imgView1,imgView2,imgView3,imgView4,imgView5,imgView6};<br /><br />for(int i=0;i&lt;kImageViewsCount;++i) {<br />&nbsp; UIImageView* v = imageViews[i];<br />&nbsp; v.image = ...;<br />}
    
Connectez-vous ou Inscrivez-vous pour répondre.