Passage du contenu d'un textfield d'un viewcontrolleur a un autre avec un tabbarcontrolleur
Zim513201
Membre
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
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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Le modèle conserve les données. Cherche, on en a parlé au moins 20 fois.
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];
}
[self.adui1 setText:varValue8];}
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 ...
___
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
tu ferais
Ensuite tu ferais ça
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
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.
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 ^^)
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.
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
C'est pas nécessaire, cf la doc du UITabBarController
Puis ensuite lire le View Controller Programming Guide aussi au passage.
Tu y verras beaucoup plus clair après.
Tu fais quoi exactement dans ton code ?
Non mais montre ton code (ou les morceaux utiles)
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
- 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...)