Passage du contenu d'un textfield d'un viewcontrolleur a un autre avec un tabbarcontrolleur

Bonjour à  tous, j'ai un petit soucis avec mon contenue de textfield que je voudrais passer d'un controlleur de vue à  un autre sachant que j'ai un tabbarcontrolleur .

J'arrive parfaitement a le faire avec la methode preparforsegue en utilisant un bouton pour passer d'une vue a une autre. Par contre avec les onglets du tabbar, ça ne fonctionne pas , ou alors seulement si je ferme et redémarre complètement l'application. Merci pour votre aide

Réponses

  • CéroceCéroce Membre, Modérateur
    MVC
    Le modèle conserve les données. Cherche, on en a parlé au moins 20 fois.
  • Oui, je sais, J'arrive parfaitement passer une variable entre différentes vues, mais avec un tabbar controlleur avec 4 onglets( donc 4 vues) ça fonctionne uniquement quand je redémarre l'app . C'est étrange !
  • Voici mon code qui fonctionne sans tabbar (sauf à  la fermeture et ouverture de l'app


     


    ReglageViewComtrolleur.m


    // methode permettant d'envoyer le contenue du texfield vers la vue arduino1


    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{


          FirstViewController *firstView = [segue destinationViewController];


        [firstView setVarValue8:self.textarduino1.text];


        }


     puis mon FirtViewcontroller.m

    - (void)viewDidLoad {

        


            [self.adui1 setText:varValue8];}


  • Am_MeAm_Me Membre
    octobre 2014 modifié #6

    Alors ce n'est pas pour paraà®tre méchant ou quoi que ce soit mais tes variables & méthode : setVarValue8, textarduino1, adui1, varValue8 ont elle un sens au final.


     


    firstView ==> ici tout le monde comprend. Bon ce n'est qu'un détail mais le jour ou tu postera un plus gros bout de code ... B)


     


    ___


     


    Voilà  c'était juste une remarque je ne veux pas égarer la conversation : alors pour ce que tu fais je te proposerai d'utiliser un singleton. Grossomodo ça ressemble à  une class/interface qui a la particularité d'être unique et d'être connu par tout le monde !


    Du coup en modifiant au lieu de faire



    [firstView setVarValue8:self.textarduino1.text];

    tu ferais 



    [[Singleton sharedInstance] setVarValue8:self.textarduino1.text];

    Ensuite tu ferais ça 



    [self.adui1 setText:[[Singleton sharedInstance]myVarValue8] ];

    Après je ne suis pas sur que ça y change grand chose à  ton problème.


     


    PS : Si tu as des questions sur les singleton il y a plein d'explication sur le net. Mais attend que d'autres personne ai commenté ton bout de code


  • Merci pour ta réponse !
  • Bonjour,


     


    Le singleton n'est pas approprié dans ce cas.


     


    le UITabBarController est un container controller. Il a par exemple une property viewController qui te retourne la liste des controllers qui contient ou bien le selectedViewController qui te renvoie le contrôleur sélectionné, donc avec tout ça tu peux récupérer n'importe lequel contrôleur et agir sur sur ses property ( text,...).


     


    Sinon cherche aussi sur le forum, je me souviens que y agit des discussion à  propos de ça.


  • AliGatorAliGator Membre, Modérateur


    Bonjour,


    Le singleton n'est pas approprié dans ce cas.


    le UITabBarController est un container controller. Il a par exemple une property viewController qui te retourne la liste des controllers qui contient ou bien le selectedViewController qui te renvoie le contrôleur sélectionné, donc avec tout ça tu peux récupérer n'importe lequel contrôleur et agir sur sur ses property ( text,...).

    Pas très MVC cette approche !!!
  • samirsamir Membre
    octobre 2014 modifié #10


    Pas très MVC cette approche !!!




     


    Oui je suis d'accord avec toi.


     


    Mais dès fois tu as besoin d'accéder un contrôleur qui est dans la stack d'un container. Tu le feras comment ?


    J'ai toujours du mal (je trouve ça moche) à  faire ça ( accéder à  la stack) mais j'ai l'impression qu'on a pas trop le choix. 


     


    Edit :


     


    Une solution est de mettre des protocols de communication entre les childs et leur container parent, le but est d'informer le container en lui passant les données nécessaire et c'est lui qui va agir sur le contenu de sa stack, mais dans ce cas il faudra sous-classe le UITabBarControlleur.


     


    Comment tu vois une meilleur solution MVC ?


  • Je le fais façon cochon avec Kwit, singleton des contrôleurs (mais suis pas fier ^^)


  • AliGatorAliGator Membre, Modérateur

    Mais dès fois tu as besoin d'accéder un contrôleur qui est dans la stack d'un container. Tu le feras comment ?
    J'ai toujours du mal (je trouve ça moche) à  faire ça ( accéder à  la stack) mais j'ai l'impression qu'on a pas trop le choix. 
     
    Edit :
     
    Une solution est de mettre des protocols de communication entre les childs et leur container parent, le but est d'informer le container en lui passant les données nécessaire et c'est lui qui va agir sur le contenu de sa stack, mais dans ce cas il faudra sous-classe le UITabBarControlleur.
     
    Comment tu vois une meilleur solution MVC ?

    Bah en fait ça dépend de quoi on parle.

    Si c'est juste un parent qui veut passer des données à  un VC enfant, genre pour passer des infos de proche en proche (ex : élément sélectionné dans le VC1 parent pour le passer au VC2 fils et qu'il affiche des trucs en conséquences), pas de soucis. Il faut quand même mieux prévoir un @protocol pour avoir un couplage faible, ceci dit, mais bon.

    Si les données que tu passes font en fait partie du modèle et définissent l'état stateful de ta représentation de ton application (exemple : le niveau de l'utilisateur dans Kwit, etc), ou si tu commences à  avoir besoin justement d'accéder à  la stack de tes ViewControllers et à  naviguer dans les ViewControllers de ta TabBar, là  ce n'est plus du même accabit, ce n'est plus du passage de proche en proche au VC immédiatement voisin.
    Si demain tu changes l'ordre de tes onglets, ou que l'un de tes onglets a un NavigationController, sur lequel peuvent être empilées une variété de ViewControllers, etc... et que tu dois vraiment "aller chercher le bon" en "fouillant dans la hiérarchie des VC" ou dans les onglets de ton TabBar, c'est qu'il y a un problème, c'est pas du passage de proche en proche là .
    C'est plutôt une information qui est partagée dans toute l'application, une information propre au modèle, à  la représentation de l'état de ton application dans son ensemble (informations du profil / de l'utilisateur connecté, information des préférences de l'utilisateur, etc), donc ça va dans le Modèle.
  • Bon en gros ça m'avance pas trop tout ça ! Lol
  • Le modèle c'est tes objets qui contiennent les données. (qui sont séparé des Vues (comment c'est affiché) et des Controlleurs (les interactions entre la vue et les données).


     


    C'est la base du MVC


  • J'ai vu sur le web, qu'il fallait un navigation controlleur pour pouvoir passer une variable entre différents vues en présence dun tabbar . Est ce vrai ?
  • C'est pas nécessaire, cf la doc du UITabBarController



    Managing the View Controllers
    viewControllers
    An array of the root view controllers displayed by the tab bar interface.
  • AliGatorAliGator Membre, Modérateur
    octobre 2014 modifié #17
    Zim je crois qu'il faut que tu te documentes d'urgence sur le MVC et son application à  Cocoa.


    Puis ensuite lire le View Controller Programming Guide aussi au passage.


    Tu y verras beaucoup plus clair après.
  • Oui, mais ma variable passe bien d'une vue à  l'autre quand mon app redémarre complètement, par contre quand je veux la passer en appuyant sur un onglet de la tabbar, elle ne passe pas . Je m'arrache les cheveux !
  • Tu fais quoi exactement dans ton code ?


  • Je récupère le contenue du textfield textarduino1 de la vue réglage pour l'afficher dans le label adui1 de la vue firstview. Et ça ne fonctionne que quand je quitte l'app et la redémarre
  • Non mais montre ton code :) (ou les morceaux utiles)


  • AliGatorAliGator Membre, Modérateur
    Si la valeur de ton textField de la vue réglage est sensé... définir des réglages, comme on peut le supposer, sa valeur a définitivement sa place dans la partie Modèle de ton application, et surtout pas à  passer en mode proche-en-proche.
  • Je vous montre mon code quand je rentre
  • AliGatorAliGator Membre, Modérateur
    Au passage nous expliquer dans les grandes lignes l'architecture de ton projet aiderait à  y voir + clair (diagramme UML ? Ou à  défaut car tu n'en n'as sans doute pas sous la main, explication de comment tu as organisé ton modèle et découpé ton projet en modules avec la responsabilité de chaque module)


    A mon avis c'est même un exercice tant utile pour nous (comprendre l'orga de ton projet pour te conseiller sur le passage de ta donnée d'un endroit à  un autre) que pour toi (faire l'exercice d'expliquer ça à  qqun d'autre fait souvent réaliser ce qui va et ne va pas)


    Par exemple "J'ai un module / singleton gérer la communication entre l'appli et ma carte Arduino, un autre pour gérer les calculs d'asservissement du robot que je contrôle, dans mon modèle j'ai une classe Settings qui regroupe tous les réglages de ma carte comme la fréquence et le port de communication, ..."
  • mon réglage.h


     //


    //  reglageViewController.h


    //  arduicommande


    //


    //  Created by frederic zimmermann on 08/10/2014.


    //  Copyright (c) 2014 frederic zimmermann. All rights reserved.


    //


     


    #import <UIKit/UIKit.h>


     


    @interface reglageViewController : UIViewController<UITextFieldDelegate>


    {


        NSString * myString1;


        IBOutlet UITextField *_textarduino1;


    }


     


    @property (weak, nonatomic) IBOutlet UIScrollView *Scrollview;


     


    @property (weak, nonatomic) IBOutlet UITextField *textpin2;


     


    @property (weak, nonatomic) IBOutlet UITextField *textpin3;


    @property (weak, nonatomic) IBOutlet UITextField *textpin4;


    @property (weak, nonatomic) IBOutlet UITextField *textpin5;


    @property (weak, nonatomic) IBOutlet UITextField *textpin6;


    @property (weak, nonatomic) IBOutlet UITextField *textpin7;


    @property (weak, nonatomic) IBOutlet UITextField *textpin8;


    @property (weak, nonatomic) IBOutlet UITextField *textpin9;


    @property (weak, nonatomic) IBOutlet UITextField *textpin22;


    @property (weak, nonatomic) IBOutlet UITextField *textpin32;


    @property (weak, nonatomic) IBOutlet UITextField *textpin42;


    @property (weak, nonatomic) IBOutlet UITextField *textpin52;


    @property (weak, nonatomic) IBOutlet UITextField *textpin62;


    @property (weak, nonatomic) IBOutlet UITextField *textpin72;


    @property (weak, nonatomic) IBOutlet UITextField *texpin82;


    @property (weak, nonatomic) IBOutlet UITextField *texpin92;


    @property (weak, nonatomic) IBOutlet UITextField *textarduino2;


    @property (weak, nonatomic) IBOutlet UITextField *textarduino1;


     


    - (IBAction)saveriport:(id)sender;


     


     mon réglage.m


    //  reglageViewController.m


    //  arduicommande


    //


    //  Created by frederic zimmermann on 08/10/2014.


    //  Copyright (c) 2014 frederic zimmermann. All rights reserved.


    //


     


    #import "reglageViewController.h"


    #import "FirstViewController.h"


     


    @interface reglageViewController ()


     


    @end


     


    @implementation reglageViewController


    @synthesize textpin2,textpin3,textpin4,textpin5,textpin6,textpin7,textpin8,textpin9,texpin82,texpin92,textpin72,textpin62,textpin52,textpin42,textpin32,textpin22,textarduino1,textarduino2;


     


    // methode permettant d'envoyer le contenue des texfield vers la vue arduino1


    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{


       


            


             FirstViewController*firstView = [segue destinationViewController];


            [firstView setVarValue8:self.textarduino1.text];


        


    }


     


     


        


    - (void)viewDidLoad {


        [self.Scrollview setScrollEnabled:YES];


        [self.Scrollview setContentSize:CGSizeMake(740, 554)];


        


        [textarduino1 setText:[[NSUserDefaults standardUserDefaults]objectForKey:@strigKey1]];


        


        [super viewDidLoad];


        // Do any additional setup after loading the view.


    }


     


    - (void)didReceiveMemoryWarning {


        [super didReceiveMemoryWarning];


        // Dispose of any resources that can be recreated.


    }


     


    /*


    #pragma mark - Navigation


     


    // In a storyboard-based application, you will often want to do a little preparation before navigation


    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {


        // Get the new view controller using [segue destinationViewController].


        // Pass the selected object to the new view controller.


    }


    */


     


    - (IBAction)saveriport:(id)sender {


        


        myString1 = [[NSString alloc] initWithFormat:@%@" ,textarduino1.text];


        [textarduino1 setText:myString1];


        NSUserDefaults *strinDefault = [NSUserDefaults standardUserDefaults];


        [strinDefault setObject:myString1 forKey:@strigKey1];


        [textarduino1 resignFirstResponder];


    }


    @end


     




     


     



    //


    //  FirstViewController.h


    //  arduicommande


    //


    //  Created by frederic zimmermann on 06/10/2014.


    //  Copyright (c) 2014 frederic zimmermann. All rights reserved.


    //


     


    #import <UIKit/UIKit.h>


     


    @interface FirstViewController : UIViewController


     


    @property (weak, nonatomic) IBOutlet UILabel *adui1;


    @property (weak, nonatomic) IBOutlet UILabel *pin2;


    @property (weak, nonatomic) IBOutlet UILabel *pin3;


    @property (weak, nonatomic) IBOutlet UILabel *pin4;


    @property (weak, nonatomic) IBOutlet UILabel *pin5;


    @property (weak, nonatomic) IBOutlet UILabel *pin6;


    @property (weak, nonatomic) IBOutlet UILabel *pin7;


    @property (weak, nonatomic) IBOutlet UILabel *pin8;


    @property (weak, nonatomic) IBOutlet UILabel *pin9;


     


     


    @property(strong,nonatomic)NSString *varValue;


    @property(strong,nonatomic)NSString *varValue1;


    @property(strong,nonatomic)NSString *varValue2;


    @property(strong,nonatomic)NSString *varValue3;


    @property(strong,nonatomic)NSString *varValue4;


    @property(strong,nonatomic)NSString *varValue5;


    @property(strong,nonatomic)NSString *varValue6;


    @property(strong,nonatomic)NSString *varValue7;


    @property(strong,nonatomic)NSString *varValue8;


    @end


     



    //  FirstViewController.m


    //  arduicommande


    //


    //  Created by frederic zimmermann on 06/10/2014.


    //  Copyright (c) 2014 frederic zimmermann. All rights reserved.


    //


     


    #import "FirstViewController.h"


    #import "reglageViewController.h"


     


    @interface FirstViewController ()


     


    @end


     


    @implementation FirstViewController


    @synthesize varValue,varValue1,varValue2,varValue3,varValue4,varValue5,varValue6,varValue7,varValue8,adui1;


     


    - (void)viewDidLoad {


        


        [self.adui1 setText:varValue8];


        


        [adui1 setText:[[NSUserDefaults standardUserDefaults]objectForKey:@strigKey1]];


     


        


        [super viewDidLoad];


        // Do any additional setup after loading the view, typically from a nib.


    }


     


    - (void)didReceiveMemoryWarning {


        [super didReceiveMemoryWarning];


        // Dispose of any resources that can be recreated.


    }


     


    @end


     

  • AliGatorAliGator Membre, Modérateur
    Ouch les conventions...
    - Utilise les balises "CODE" sur le forum pour poster du code, là  c'est difficilement lisible (surtout sur mobile)
    - Fais gaffe au termes utilisés ("saveriport" ?!) et respecte les conventions de nommage (casse de "reglageViewController", "saveriport", etc)
    - Ne @synthétise pas tes @property (ou alors si tu tiens à  le faire, n'utilise pas le même nom pour la backing ivar et la @property, ça mène à  des confusions d'usage, comme celles que tu as dans ton code, où tu utilises tantôt "self.adui1" et tantôt "adui1" directement, ce qui n'a pas le même impact mais tu ne t'en rends pas compte
    - N'utilise pas directement les ivars (d'ailleurs pourquoi tu as encore 2 ivars alors que tout le reste est bien en @property ?)

    Sinon j'ai l'impression que le seul modèle que tu as c'est finalement tout ce que tu passes par NSUserDefaults ? (ce qui peut avoir du sens selon ton appli, mais on n'a pas trop de détail donc bon...)
Connectez-vous ou Inscrivez-vous pour répondre.