[Débutant] Passer une valeur d'un controller vers vers un autre ?

pinuspinus Membre
01:13 modifié dans API UIKit #1
Bonjour,

Je suis toujours dans mon processus de découverte du SDK iPhone (et d'ObjC). Je suis bloqué sur un truc tout con sûrement à  cause de ma difficulté à  apprehender comment l'API fonctionne :

J'ai une RootView qui propose une UITableView qui contient 3 rows. Lors que je choisis un row, ça charge une UIViewController (via "pushViewController") qui elle affiche une image en provenance d'Internet. ça fonctionne super bien.

Je voulais augmenter la difficulté en affichant une image différente (donc en appelant une URL différente) en fonction de la row sélectionnée. Mais je ne trouve pas le moyen de "passer" à  la UIViewController qui va se charger, un "tag" lui permettant de faire un switch case et donc de pouvoir savoir quelle URL utiliser pour charger mon image.

Plus généralement donc: comment passer un paramètre à  la UIViewController qui va se charger ?

En me relisant, je me rends compte que je ne suis pas très clair. M'enfin...

D'avance merci.

Pinus Biloute.

Réponses

  • AliGatorAliGator Membre, Modérateur
    novembre 2008 modifié #2
    Salut Biloute,

    Le plus simple et le plus adéquat est de créer une sous-classe de ta UIViewController qui te sert à  afficher l'image.
    Disons MyViewController, qui dérive donc de UIViewController...
    - Ensuite je ne sais pas comment tu créais ta UIViewController que tu "push-ait" ([tt]pushViewController:animated:[/tt]), je veux dire si elle était associé à  un fichier XIB pour définir son contenu ou si tu faisait tout par code... si tu as un XIB associé, il faut penser à  indiquer que le "File's Owner", qui était typiquement dans ce cas un UIViewController, sera en fait plus précisément un "MyViewController".
    - Et au moment de créer ton ViewController pour le pusher, tu crées un MyViewController au lieu d'un UIViewController.

    Ceci va te permettre alors de rajouter à  ta sous-classe MyViewController des variables d'instance pour stocker ce qui t'es nécessaire (par exemple l'URL de l'image à  charger), et dans le "viewDidLoad" (ou le "loadView"si tu crées ta vue par le code à  la limite mais bon) tu utilises alors cette valeur de ta variable d'instance pour charger l'image voulue.
    // code de ton UITableViewDelegate qui va pusher ta nouvelle vue<br />- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {<br />    // Navigation logic -- create and push a new view controller<br />    MyViewController* imageVC = [[MyViewController alloc] initWithNibName:@&quot;MyViewController&quot; bundle:nil];<br />    imageVC.title = @&quot;Image&quot;; // ou le titre que tu veux<br />    // soit urlToLoad une variable d&#39;instance de ta classe &quot;MyViewController&quot;, déclarée en @property<br />    imageVC.urlToLoad = [NSURL urlWithString:@&quot;http://www.apple.com&quot;];<br /><br />    [self.navigationController pushViewController:imageVC animated:YES];<br />    [imageVC release];<br />}
    
    @interface MyViewController : UIViewController {<br />    NSURL* urlToLoad;<br />}<br />@property(nonatomic,retain) NSURL* urlToLoad;<br />@end<br /><br />@implementation SecondViewController<br />@synthesize urlToLoad;<br /><br />-(void)viewDidLoad<br />{<br />    UIImageView* imageView = (UIImageView*)(self.view); // si je suppose que la view principale de ton ViewController est une ImageView<br />    imageView.image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL: urlToLoad]];<br />}<br /><br />-(void)dealloc<br />{<br />    [urlToLoad release];<br />    [(UIImageView*)(self.view).image release];<br />    [super dealloc];<br />}<br />@end
    
    (Non testé, je te laisse vérifier dans Xcode)

    Et encore j'ai mis une NSURL qui est transformée par le ViewController en une UIImage, mais tu pourrais directement sur ce même principe passer directement la UIImage à  ton ViewController avant de le "pusher", à  toi de voir (après si tu veux gérer les cas où l'URL passée est mauvaise, et afficher un truc particulier si l'image n'est pas trouvée, etc, à  toi de voir qui du NavigationController parent ou de la MyViewController que tu push est responsable de vérifier ça, question de conception)
  • pinuspinus Membre
    01:13 modifié #3
    Merci ! Je vais essayer ça (que je dois absolument maà®triser car je vais me retrouver souvent dans cette situation !).

    Là  j'avais trouvé l'idée de passer par un Singleton contenant un tag permettant de faire le switch mais ça fait un peu usine à  gaz.

    Encore merci !

    Pinus
  • pinuspinus Membre
    01:13 modifié #4
    AliGator ça marche nickel merci !

    Pinus
  • guittonewsguittonews Membre
    février 2009 modifié #5
    bonjour,
    je suis nouveau sur le forum et en beta sur objectiveC :)

    J'ai assez bien compris le principe que vous expliquez cependant j'ai une exception levée à  cet endroit :

    imageView=(UIImageView*)(self.view);
    


    Peut être que j'ai loupé quelque chose...au niveau du nib il y a quelque chose de précis à  faire? (hormis de mettre le viewController au file's owner)

    Merci d'avance pour vos réponses.

    guittonews

    EDIT : je vais faire un autre topic vu que le problème est légèrement different...
Connectez-vous ou Inscrivez-vous pour répondre.