iOS – Passer la variable pour voir le controller

J'ai une vue avec un controller de vue et quand je montre cette vue sur l'écran, je veux pouvoir lui passer des variables de la class appelante, de sorte que je puisse placer les valeurs des labels etc.

D'abord, j'ai juste essayé de créer une propriété pour l'une des labels, et d'appeler cela depuis la class appelante. Par exemple:

SetTeamsViewController *vc = [[SetTeamsViewController alloc] init]; vc.myLabel.text = self.teamCount; [self presentModalViewController:vc animated:YES]; [vc release]; 

Cependant, cela n'a pas fonctionné. J'ai donc essayé de créer un initialiseur de commodité.

 SetTeamsViewController *vc = [[SetTeamsViewController alloc] initWithTeamCount:self.teamCount]; 

Et puis dans le SetTeamsViewController j'ai eu

 - (id)initWithTeamCount:(int)teamCount { self = [super initWithNibName:nil bundle:nil]; if (self) { // Custom initialization self.teamCountLabel.text = [NSSsortingng ssortingngWithFormat:@"%d",teamCount]; } return self; } 

Cependant, cela n'a pas fonctionné non plus. Il ne fait que charger la valeur que j'ai donnée à l'label dans le file nib. J'ai NSLog() le code avec NSLog() s et il passe les bonnes valeurs de variable autour, c'est juste ne pas définir l'label.

Toute aide serait grandement appréciée.

EDIT: Je viens d'essayer de définir une variable d'instance dans mon initialiseur désigné, puis de définir l'label dans viewDidLoad et cela fonctionne! Est-ce la meilleure façon de faire cela?

De même, lorsque je rejette ce controller de vue modale, je mets également à jour le text d'un button dans la vue du ViewController appelant. Cependant, si j'appuie de nouveau sur ce button (pour afficher à nouveau la vue modale) alors que l'autre vue est animée à l'écran, le button a temporairement sa valeur originale (à partir de la pointe). Est-ce que quelqu'un sait pourquoi c'est comme ça?

Lors de l'initialisation d'un controller de vue, dans la méthode initWithNibName, les vues qui résident dans le controller de vue ne sont pas encore initialisées et vous ne pouvez pas encore définir leurs propriétés. Faites tout ce dont vous avez besoin c'est vue basée sur la méthode "viewDidLoad".

Je ne suis pas un pro mais cela peut vous aider.

Dans l'en-tête view1.h , déclarez la propriété désirée:

 // view1.h @interface view1 : UIViewController { NSSsortingng *passingVariable; } @property (nonatomic, strong) NSSsortingng *passingVariable; @end 

puis dans l'implémentation de view1 , synthétiser la variable:

 // view1.m @implementation view1 @synthesize passingVariable; // the rest of the implementation @end 

et, enfin, dans l'implémentation de l'autre controller de vue, view2:

 // view2.m #import "view1.h" @implementation view2 -(IBAction)changeview { view1 *myview = [[view1 alloc] init]; myview.passingVariable = @"Hello Variable"; [self.navigationController pushViewController:myview animated:YES]; } @end 

Ici j'essaie de passer de view2 à view 1 et d'initialiser aussi le ivar passingVariable de view1 . J'espère que ceci vous aidera.

Ici, je passe le text de l'label du ViewController au text d'label de SecondViewController

ViewController.h

 #import <UIKit/UIKit.h> @interface ViewController : UIViewController { // please make your control on XIB set these IBOutlet's //I'm not showing how to connect these with XIB IBOutlet UILabel *lblView; IBOutlet UIButton *buttonGo; } //this is method which will push the view -(IBAction)buttonGoClickAction:(id)sender; 

ViewController.m

 -(IBAction)buttonGoClickAction:(id)sender { SecondViewController *secondViewObject = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil]; //before pushing give the text secondViewObject.ssortingng = lblView.text; [self.navigationController pushViewController:secondViewObject animated:YES]; } 

SecondViewController.h

 #import <UIKit/UIKit.h> @interface SecondViewController : UIViewController { IBOutlet UILabel *labelView; NSSsortingng *ssortingng; } //set the ssortingng property @property(nonatomic, retain) NSSsortingng *ssortingng; @end 

SecondViewController.m

  #import "SecondViewController.h" @implementation SecondViewController //synthesize ssortingng here @synthesize ssortingng; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. //Here you will get the ssortingng labelView.text = ssortingng; } 

Tout d'abord vous vérifiez que vous avez joint cette label IBOutlet en xib ou pas si vous l'avez fait via Interface Builder ….

Utilisez-le comme ça ….

 SetTeamsViewController *vc = [[SetTeamsViewController alloc] initWithTeamCount:teamCount]; 

Prenez une variable de string dans le file .h et définissez cette string ici. NSSting * str in .h

 - (id)initWithTeamCount:(int)teamCount { self = [super init]; if (self) { // Custom initialization str = [NSSsortingng ssortingngWithFormat:@"%d",teamCount]; } return self; } 

et définissez votre libellé dans viewDidLoad: ou dans viewWillApear:

  self.teamCountLabel.text = str; 

Que cela vous aide

Comme dit par stavash, le contrôle dans le xib est créé dans la vue a chargé. Pour être plus précis, ils sont créés avec cette ligne:

  [super viewDidLoad]; 

Donc, mylabel n'existe pas avant cette date (c'est nul).

Le moyen le plus simple est de le faire:

  SetTeamsViewController *vc = [[SetTeamsViewController alloc] init]; [self presentModalViewController:vc animated:YES]; vc.myLabel.text = self.teamCount; [vc release]; 

Le path le plus long mais le plus correct est d'avoir un membre NSSsortingng * dans la class SetTeamsViewController, de le définir sur teamCount avant d'afficher la window, et dans la vue, de charger cette valeur membre dans votre label.

Cdt

Cela dépend de votre besoin. Vous pouvez utiliser la class Singleton pour partager vos variables entre différentes classs. Définissez toutes les variables que vous voulez partager dans votre DataClass.

dans le file .h (où RootViewController est ma DataClass, remplacez le nom par votre nouvelle class)

 +(RootViewController*)sharedFirstViewController; 

au format .m

 //make the class singleton:- +(RootViewController*)sharedFirstViewController { @synchronized([RootViewController class]) { if (!_sharedFirstViewController) [[self alloc] init]; return _sharedFirstViewController; } return nil; } +(id)alloc { @synchronized([RootViewController class]) { NSAssert(_sharedFirstViewController == nil, @"Attempted to allocate a second instance of a singleton."); _sharedFirstViewController = [super alloc]; return _sharedFirstViewController; } return nil; } -(id)init { self = [super init]; if (self != nil) { // initialize stuff here } return self; } 

après cela, vous pouvez utiliser votre variable dans n'importe quelle autre class comme celle-ci

 [RootViewController sharedFirstViewController].variable 

J'espère que ça vous aidera 🙂

Avec Storyboards, le bon path est de passer l'indexPath comme argument de l'expéditeur dans performSegueWithIdentifier

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"segueIdentifier" sender:indexPath]; } 

et pour définir une propriété dans le controller de destination:

 - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToSsortingng: @"segueIdentifier"]) { NSIndexPath *indexPath = sender; DetailViewController *dest = [segue destinationViewController]; dest.usersArray = [self.usersArray objectAtIndex:indexPath.row]; } } 

Ce que j'ai fait chaque fois que j'avais besoin d'une autre class pour avoir les variables de la class précédente, j'ai soit mis en place une class globale qui stockera les valeurs en cas de besoin dans plus d'locations ou dans l'interface que vous pouvez définir variables @public. Ces variables peuvent être définies à l'aide du controller que vous avez créé pour la vue suivante en tant que telle.

controller-> pub_var1 = val1; controller-> pub_var2 = val2;

Cela sera fait avant de passer la vue au controller racine ou juste avant d'appeler la vue suivante. Vous devrez #importer "class.h" pour pouvoir accéder à ces variables publiques.

Je peux montrer le code si ce n'est pas clair