Pointer vers une view en dynamique ?

[TK][TK] Membre
12:29 modifié dans API UIKit #1
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 !!
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

Réponses

  • 12:29 modifié #2
    Tu peux utiliser les tag directement nan?

    <br />[[mySuperview subviewWithTag:page] stopVideo];<br />
    


    (Après avoir, au préalable, setté les tag évidemment..)

    Tu as toujours la solution suivante:
    <br />[[[mySuperview subviews] objecAtIndex:page] stopVideo];<br />
    
  • AliGatorAliGator Membre, Modérateur
    12:29 modifié #3
    Les tags sont en effet ce qu'il y a de plus simple. C'est une propriété de UIView de type "entier" qui est laissée libre à  l'utilisateur (tu mets la valeur que tu veux) et ne sert qu'à  identifier la vue avec un identifiant numérique, pour pouvoir la récupérer avec subviewWithTag.

    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
    UIView* vues&#91;] = {vue1, vue2, vue3}; // construire le tableau C de vues<br />UIView* v = vues[page]; // accéder à  la vue &#39;page&#39; du tableau de vues<br />[v stopVideo];
    



    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 ;)
  • [TK][TK] Membre
    12:29 modifié #4
    Merci pour vos réponses, cependant je patoge toujours, un peu moins cependant ;-)

    Je reprends mon architecture:
    dans le h:
    #import &lt;UIKit/UIKit.h&gt;<br />#import &quot;Vue1.h&quot;<br />#import &quot;Vue2.h&quot;<br />#import &quot;Vue3.h&quot;<br /><br />@interface ScrollingViewController : UIViewController<br />&lt;UIScrollViewDelegate&gt;<br />{<br />	IBOutlet UIScrollView* scrollView;<br />	IBOutlet UIPageControl* pageControl;<br />	Vue1 *vue1;<br />	Vue2 *vue2;<br />	Vue3 *vue3;<br />	int kNumberSlide;<br />	NSArray *pageArray;<br />	<br />	<br />&nbsp; &nbsp; BOOL pageControlIsChangingPage;<br />	BOOL pageControlUsed;<br />	<br />	NSInteger page;<br />	NSInteger anciennePage;<br />}<br />@property (nonatomic, retain) UIView *scrollView;<br />@property (nonatomic, retain) UIPageControl* pageControl;<br /><br />@property (nonatomic, retain) Vue1 *vue1;<br />@property (nonatomic, retain) Vue2 *vue2;<br />@property (nonatomic, retain) Vue3 *vue3;
    


    dans le m:
    CGRect frame = scrollView.frame;<br />	frame.origin.y = 0;<br />	frame.origin.x = 0;<br />	<br />	frame.origin.y = 0;<br />	frame.origin.x = frame.origin.x ;<br />	vue1 = [[Vue1 alloc]init];<br />	vue1.view.frame = frame ;<br />	vue1.view.tag = 1;<br />	[scrollView addSubview:vue1.view];<br />	<br />	frame.origin.y = 0;<br />	frame.origin.x = frame.origin.x + frame.size.width&nbsp; ;<br />	vue2 = [[Vue2 alloc]init];<br />	vue2.view.frame = frame ;<br />	vue2.view.tag = 2;<br />	[scrollView addSubview:vue2.view];<br />	<br />	frame.origin.y = 0;<br />	frame.origin.x = frame.origin.x + frame.size.width&nbsp; ;<br />	vue3 = [[Vue3 alloc]init];<br />	vue3.view.frame = frame ;<br />	vue3.view.tag = 3;<br />	[scrollView addSubview:vue3.view];
    


    en testant, je ne tombe jamais sur la vue taggée
    NSLog(@&quot;%@&quot;,[scrollView viewWithTag:page]);//&lt;UIView: 0x8236010; frame = (0 0; 320 460); autoresize = W+H; tag = 1; layer = &lt;CALayer: 0x8236040&gt;&gt;<br />NSLog(@&quot;%@&quot;, [pageArray objectAtIndex:page]);//&lt;Vue1: 0x82055b0&gt;<br />
    

    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.
  • 12:29 modifié #5
    Hm... a tout hasard... viewWithTag:page.. page == 0?
    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* ?
  • [TK][TK] Membre
    12:29 modifié #6
    désolé d'être aussi inexpérimenté !!
    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 :-(
  • CéroceCéroce Membre, Modérateur
    12:29 modifié #7
    Tu as l'air de confondre Vue (UIView) et Contrôleur de vue (UIViewController).
    Vue1, Vue2 et Vue3 héritent de UIViewController ou me trompe-je ?
Connectez-vous ou Inscrivez-vous pour répondre.