iOS: passa la variabile per visualizzare il controller

Ho una vista con un controller di visualizzazione e quando mostro questa vista sullo schermo, voglio essere in grado di passare delle variabili dalla class chiamante, in modo da poter impostare i valori delle etichette, ecc.

Innanzitutto, ho appena provato a creare una proprietà per una delle etichette e a chiamarla dalla class chiamante. Per esempio:

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

Tuttavia, questo non ha funzionato. Così ho provato a creare un inizializzatore di convenienza.

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

E poi nel SetTeamsViewController che avevo

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

Tuttavia, questo non ha funzionato neanche. Sta caricando solo il valore che ho dato all’etichetta nel file del pennino. Ho sparpagliato il codice con NSLog() s e sta trasmettendo i valori delle variabili corrette, non è solo l’impostazione dell’etichetta.

Qualsiasi aiuto sarebbe molto apprezzato.

EDIT: Ho appena provato a impostare una variabile di istanza nel mio inizializzatore designato, e quindi impostare l’etichetta in viewDidLoad e che funziona! È questo il modo migliore per farlo?

Inoltre, quando si chiude questo controller di visualizzazione modale, aggiorno anche il testo di un pulsante nella vista del ViewController chiamante. Tuttavia, se premo di nuovo questo pulsante (per mostrare di nuovo la vista modale) mentre l’altra vista è animata sullo schermo, il pulsante ha temporaneamente il suo valore originale di nuovo (dal pennino). qualcuno sà perche è cosi?

Quando un controller di visualizzazione viene inizializzato, all’interno del metodo initWithNibName, le viste che risiedono nel controller di visualizzazione non sono ancora inizializzate e non è ancora ansible impostarne le proprietà. Fai tutto ciò che ti serve è la vista basata sul metodo “viewDidLoad”.

Non sono un professionista ma questo potrebbe aiutarti.

Nell’intestazione view1.h , dichiarare la proprietà desiderata:

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

e quindi nell’implementazione di view1 , sintetizzare la variabile:

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

e, infine, nell’implementazione dell’altro controller della vista, 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 

qui sto provando a passare da view2 a view 1 e anche a inizializzare il ivar della viewvarible passing1. spero che questo ti possa aiutare.

Qui sto passando il testo dell’etichetta del ViewController al testo dell’etichetta di SecondViewController

ViewController.h

 #import  @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.string = lblView.text; [self.navigationController pushViewController:secondViewObject animated:YES]; } 

SecondViewController.h

 #import  @interface SecondViewController : UIViewController { IBOutlet UILabel *labelView; NSString *string; } //set the string property @property(nonatomic, retain) NSString *string; @end 

SecondViewController.m

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

Innanzitutto verifichi di aver allegato questa etichetta IBOutlet in xib o no se l’hai fatta tramite Interface Builder ….

usalo così …

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

Prendi una variabile di stringa nel file .h e imposta quella stringa qui .. NSSting * str in .h

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

e imposta l’etichetta in viewDidLoad: o in viewWillApear:

  self.teamCountLabel.text = str; 

Possa questo ti aiuterà

Come detto da stavash, il controllo nello xib viene creato nella vista caricata. Per essere più precisi, sono creati con quella linea:

  [super viewDidLoad]; 

Quindi, mylabel non esiste prima di quel momento (è zero).

Il modo più semplice è farlo:

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

Il percorso più lungo ma più corretto consiste nell’avere un membro NSString * nella class SetTeamsViewController, impostarlo su teamCount prima di mostrare la finestra e nella vista è stato caricato per inserire il valore di membrana nell’etichetta.

cdt

Dipende dal tuo bisogno. Puoi usare la class Singleton per condividere le tue variabili tra classi diverse. Definisci tutte le variabili che vuoi condividere nel tuo DataClass.

nel file .h (dove RootViewController è il mio DataClass, sostituire il nome con la nuova class)

 +(RootViewController*)sharedFirstViewController; 

nel file .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; } 

dopodiché puoi usare la tua variabile in qualsiasi altra class come questa

 [RootViewController sharedFirstViewController].variable 

Spero ti sia d’aiuto 🙂

Con Storyboards il modo giusto è passare l’indexPath come argomento del mittente in performSegueWithIdentifier

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

e per impostare una proprietà nel controller di destinazione:

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

Quello che ho fatto ogni volta che ho bisogno di un’altra class per avere le variabili della class precedente I o impostare una class globale che memorizzerà i valori incase ne ho bisogno in più posizioni o nell’interfaccia è ansible impostare le variabili @ public. Queste variabili possono essere impostate usando il controller che hai creato per la vista successiva come tale.

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

Questo sarà fatto prima di passare la vista al controller di root o appena prima di chiamare la vista successiva. Dovrai #importare “class.h” in modo da poter accedere a tali variabili pubbliche.

Posso mostrare il codice se questo non è chiaro