Pointer vers une view en dynamique ?
Bonjour,
Je m'excuse d'avance de mon inexpérience, je ne sais où chercher et quoi utiliser comme mot pertinent de recherche.
J'ai créé un UIPageControl et un UIScrollView avec 3 vues: Vue1, Vue2 et Vue3. dans chaque vues il y a des éléments récurrents dont un player video et je voudrais qu'à chaque fois qu'on passe d'une vue à l'autre stopper la video en cours et là je patoge pour le pointage:
J'aurais tendance à vouloir écrire "Vue"+maVariable pour y accéder mais que neni, alors j'utilise un NSArray où je place mes vues et là forcément, ça marche mais c'est pas propre du tout !!
Donc ma question, comment écrire l'équivalent de "Vue"+maVariable ou vers quoi m'orienter pour éviter l'écriture d'un tableau ou vers quoi dois je chercher pour trouver réponse.
Merci
Je m'excuse d'avance de mon inexpérience, je ne sais où chercher et quoi utiliser comme mot pertinent de recherche.
J'ai créé un UIPageControl et un UIScrollView avec 3 vues: Vue1, Vue2 et Vue3. dans chaque vues il y a des éléments récurrents dont un player video et je voudrais qu'à chaque fois qu'on passe d'une vue à l'autre stopper la video en cours et là je patoge pour le pointage:
J'aurais tendance à vouloir écrire "Vue"+maVariable pour y accéder mais que neni, alors j'utilise un NSArray où je place mes vues et là forcément, ça marche mais c'est pas propre du tout !!
pageArray = [NSArray arrayWithObjects:vue1, vue2, vue3, nil];<br />[[pageArray objectAtIndex:page] stopVideo];
Donc ma question, comment écrire l'équivalent de "Vue"+maVariable ou vers quoi m'orienter pour éviter l'écriture d'un tableau ou vers quoi dois je chercher pour trouver réponse.
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
(Après avoir, au préalable, setté les tag évidemment..)
Tu as toujours la solution suivante:
Si tu as une variable d'instance (typiquement un IBOutlet) pour chacune de tes vues, nommées vue1, vue2, vue3, alors tu peux aussi utiliser le KVC pour accéder à la variable dont le nom est [NSString stringWithFormat:@vue%d,page], mais bon c'est plus compliqué et moins direct que d'utiliser les tags
Depuis iOS4 il existe aussi les IBOutletCollection qui permettent d'avoir une variable de type NSArray qui soit comme un tableau de IBOutlets, tu y connectes plusieurs objets (et non plus un seul comme avec un IBOutlet) et côté code tu accèdes à ces objets connectés via le NSArray. Mais là encore, dans ton cas c'est moins pratique que subviewWithTag, et en plus ce n'est compatible que iOS4.
Enfin tu peux même, si ton nombre de vues est fixe (3 si j'ai tout suivi), soit les mettre dans un NSArray comme tu as fait et y accéder par ce biais, soit utiliser un tableau C (vu que le nombre de vues est fixe et que tu en fais un usage simple), genre
Bref au final tu as plein de solutions, mais "composer le nom de variable en juxtaposant le préfixe 'vue' et le numéro de page" c'est pas trop possible dynamiquement, ou plutôt ça l'est, via le KVC évoqué plus haut, mais c'est la solution la moins élégante et même la moins performante, à l'inverse de subviewWithTag
Je reprends mon architecture:
dans le h:
dans le m:
en testant, je ne tombe jamais sur la vue taggée
la sortie ci-dessus est équivalente à [[scrollView subviews] objectAtIndex:page]
La méthode du tableau C fonctionne même si j'ai des warnings m'indiquant que c'est incompatible Objective-C mais je voudrais bien capter les tags qui pour cette utilisation correspond mieux.
Parce que là dans ton code tu as commencé le tagging à l'index 1, et non 0...
Et y-a-t-il autre chose que tes View* dans ta scrollview? Je veux dire, si tu log "[scrollView subviews]", est-ce que tu as autre chose que tes View* ?
un NSLog(@%@", vue1.view); me renvoi
2010-12-29 13:24:04.656 Scrolling[30837:207] vue1: <UIView: 0x8017220; frame = (0 0; 320 460); autoresize = W+H; tag = 1; layer = <CALayer: 0x8017250>>
et NSLog(@%@", [scrollView subviews]);
2010-12-29 13:24:04.657 Scrolling[30837:207] subviews: (
"<UIView: 0x8017220; frame = (0 0; 320 460); autoresize = W+H; tag = 1; layer = <CALayer: 0x8017250>>",
"<UIView: 0x8017a10; frame = (320 0; 320 460); autoresize = W+H; tag = 2; layer = <CALayer: 0x8017a40>>",
"<UIView: 0x8017ac0; frame = (640 0; 320 460); autoresize = W+H; tag = 3; layer = <CALayer: 0x8017af0>>"
)
bref problème niveau ciblage car ce dont j'ai besoin c'est du vue1 et non vue1.view, c'est pourquoi ça ne marche pas, ici il me sort que des UIView et non mes vueX, j'ai beau faire le tour et relire mon bouquin, j'ai toujours pas saisie :-(
Vue1, Vue2 et Vue3 héritent de UIViewController ou me trompe-je ?