Charger une vue aléatoirement [résolu]

MAGEMAGE Membre
juin 2010 modifié dans API UIKit #1
Après avoir cliqué sur un bouton, j'aimerai passer à  une vue qui soit chargée aléatoirement dans un groupe. Un peu genre tirage d'une carte.

Est-ce qu'on peut me donner une piste pour ceci ?

Réponses

  • Philippe49Philippe49 Membre
    15:41 modifié #2
    switch(random()%nombreDeVues) {
      case 0 :
          // charger la vue 0
          break;
      case 1 :
          // charger la vue 1
          break;
      case  ....
    }


    ou utiliser une NSArray de viewcontrollers si ils sont déjà  créés
    array[random()%nombreDeViewController]
  • MAGEMAGE Membre
    15:41 modifié #3
    :o Ouah ! Je suis tout nouveau dans le monde de la programmation et sur ce serveur... et stupéfait à  quelle vitesse je reçois une réponse.

    Je vais voir si j'arrive à  intégrer ça, merci.
  • Philippe49Philippe49 Membre
    15:41 modifié #4
    dans 1238797869:

    et stupéfait à  quelle vitesse je reçois une réponse.

    Les surprises, t'est p't être pas encore au bout !!  :)

    Bon il est quand même d'usage de saluer les nouveaux venus  :p
  • MAGEMAGE Membre
    15:41 modifié #5
    Bon, en fait je me rends compte que j'ai des soucis déjà  avant... Je sais pas si j'arrive à  poser mon problème clairement tellement je nage, ou si la question est trop basique, mais je vais essayer :

    J'ai une TabBar avec 4 vues. Jusque là  tout va bien (au moins ça). Ensuite, j'aimerai : partir d'une de ces vues avoir un bouton qui charge une autre vue.
    Avant de le faire au hasard sur plusieurs, j'ai testé avec une seule et ça ne marche pas.

    J'ai une erreur "warning :passing argument 1 of 'setMaVue' from distinct Ojective-C type.
    Voici mon code pour le bouton :
    <br />-(IBAction)switchViews:(id)sender<br />{ <br />	TravailView01 *travail01 = [[TravailView01 alloc] initWithNibName:@&quot;YellowView&quot; bundle:nil];<br />	self.travailView01 = travail01;<br />	[travail01 release];<br />}<br />}
    


    Autre chose de bizarre : la fonction du bouton apparaissait sur le main.xib. Maintenant j'ai bricolé et la méthode est apparue, mais je ne suis pas trop sûr du côté des liens.

    J'ai vu qu'il y avait quelque chose similaire sur le forum : http://www.osx-dev.com/index.php?topic=3259.0 et j'ai tenté de voir dans la doc Apple, mais une petite piste serai la bienvenue.
  • Philippe49Philippe49 Membre
    avril 2009 modifié #6
    dans 1238970132:

    J'ai une erreur "warning :passing argument 1 of 'setMaVue' from distinct Ojective-C type.
    Voici mon code pour le bouton :
    <br />-(IBAction)switchViews:(id)sender<br />{ <br />	TravailView01 *travail01 = [[TravailView01 alloc] initWithNibName:@&quot;YellowView&quot; bundle:nil];<br />	self.travailView01 = travail01;<br />	[travail01 release];<br />}<br />}
    


    Pour que ce code soit valide, il faut que la property  soit définie ainsi :
    @property(retain) TravailView01 * travailView01;
    et que travailView01 hérite de UIViewController
    Est-ce le cas ?

    Pour qu'il soit efficace, il faut faire quelque chose de la vue de travailView01, et là  qu'as-tu prévu ?

  • MAGEMAGE Membre
    15:41 modifié #7
    J'avais effectivement commencé par @property (retain, nonatomic) TravailView01 *travailView01; et puis j'avais essayé de mettre @property (retain, nonatomic) UIView *travailView01;
    Ce changement a supprimé l'erreur... mais pas encore de changement de vue. (TravailVue01 hérite de UIViewController).

    Au niveau de la vue, j'avais mis les mêmes noms (Travail01.xib), je viens de le changer pour éviter des confusion (Tr01.xib). J'ai changé sa classe en TravailView01, mais c'est tout. (j'avais également changé celle de la vue qui contient le bouton (TravailView avec TravailViewController) pour que j'accède à  l'action dans le File's Owner.
  • Philippe49Philippe49 Membre
    15:41 modifié #8
    Oui les deux sont possibles, on peut définir soit une UIView soit un UIViewController, mais c'est la construction dans un xib secondaire initWithNibName qui fait passer par un UIViewController. Pour  une UIView on la rajouterait dans le xib principal avec un IBOutlet.


    Pour changer la vue brutalement, tu peux faire
            [self.view addSubview:travailView01.view];
    Pour faire une transition, tu peux prendre modèle sur la page du Tuto des transitions :Transitions Standards push, reveal, moveIn, fade
  • MAGEMAGE Membre
    avril 2009 modifié #9
    Bon, j'ai pas encore tout compris, mais je vais prendre un peu de temps. (la ligne de code que j'ai rajouté plante)

    Quelle méthode me conseilles-tu parmi tes deux possibilités citées. Sachant qu'à  partir de cette vue (Tr01), je vais accéder à  une autre sous-vue (Tr01a) ?

    [EDIT] La console me confirme que c'est une question d'Outlet
  • Philippe49Philippe49 Membre
    15:41 modifié #10
    Les xib séparés sont préférables lorsque cela s'étoffe comme cela semble être le cas dans ton appli, c'est plus modulable, et moins confus. Donc utilise plutôt les UIViewController.


  • MAGEMAGE Membre
    15:41 modifié #11
    C'est marrant comme un petit projet qui paraissait si simple au départ...

    En tous cas, encore merci pour cette aide. J'apprend énormément. Même si je me rends bien compte que je suis encore loin, petit à  petit ces lignes ont un sens et j'ai envie d'en savoir toujours plus.

    Bonne nouvelle. Ma vue se charge enfin. Mais cette fois, c'est le random qui n'est pas accepté.

    Que les programmeurs me pardonne pour cette présentation qui est sûrement très loin de ce qu'il faille faire, mais j'ai pas trouvé.
    -(IBAction)switchViews:(id)sender<br />{<br />	switch(random()%2)<br />	{<br />		case 0 :<br />			TravailView01 *travail01 = [[TravailView01 alloc] <br />										initWithNibName:@&quot;Tr01&quot; bundle:nil];<br />			self.travailView01 = travail01;<br />			[self.view addSubview:travailView01.view];<br />			[travail01 release];<br />			break;<br />		case 1 :.........<br />
    

    En insérant mes vues ainsi, Xcode n'est pas content du tout. Mais pourquoi ?
  • Philippe49Philippe49 Membre
    15:41 modifié #12
    Erreur de C : quand on définit des variables dans un switch, il faut mettre des accolades

    -(IBAction)switchViews:(id)sender<br />{<br />	switch(random()%2)<br />	{<br />		case 0 :<br />		{<br />			TravailView01 *travail01 = [[TravailView01 alloc] <br />										initWithNibName:@&quot;Tr01&quot; bundle:nil];<br />			self.travailView01 = travail01;<br />			[self.view addSubview:travailView01.view];<br />			[travail01 release];<br />			break;<br />		}<br />		case 1 :.........
    
  • MAGEMAGE Membre
    15:41 modifié #13
    C'est toujours la même vue qui est chargée.
  • AliGatorAliGator Membre, Modérateur
    15:41 modifié #14
    Normal, le générateur de nombre aléatoire n'est pas initialisé.
    Donc random() fournit une suite de nombres pseudo-aléatoires... mais toujours les mêmes à  chaque relancement de l'appli.
    Faut utiliser srandom pour initialiser le générateur aléatoire, en lui passant une valeur toujours différente (genre en général on lui passe time(NULL), que tu peux trouver dans <time.h>)

    Donc appeller au moins une fois [tt]srandom(time(NULL))[/tt] avant d'appeler random pour la première fois si tu veux avoir des valeurs aléatoires différentes entre chaque run.
  • MAGEMAGE Membre
    15:41 modifié #15
    :kicking: Génial ! MERCI beaucoup.
Connectez-vous ou Inscrivez-vous pour répondre.