Xcode – aggiorna il testo dell’etichetta ViewController da una vista diversa

Ho due controller di vista nel mio progetto ViewController , SettingsView . Qui sto cercando di aggiornare l’etichetta ViewController's , quando clicco sul pulsante Indietro SettingsView's . NSLog sta funzionando bene, ma l’etichetta non si sta aggiornando … Per favore aiutami ….

SettingsView.m

 -(IBAction)backToMain:(id) sender { //calling update function from ViewController ViewController * vc = [[ViewController alloc]init]; [vc updateLabel]; [vc release]; //close the SettingsView [self dismissModalViewControllerAnimated:YES]; } 

ViewController.m

 - (void)updateLabel { NSLog(@"Iam inside updateLabel"); self.myLabel.text = @"test"; } 

Potresti dirmi cosa c’è di sbagliato nel mio codice? Grazie!

Devi implementare protocolli per questo. Segui questo:

1) In SettingView.h definire un protocollo come questo

  @protocol ViewControllerDelegate -(void) updateLabel; @end 

2) Definisci proprietà in .h class e sintesi in .m class ..

  @property (nonatomic, retain) id  viewControllerDelegate; 

3) In SettingsView.m IBAction

  -(IBAction)backToMain:(id) sender { [viewControllerDelegate updateLabel]; } 

4) In ViewController.h adotta un protocollo come questo

 @interface ViewController 

5) In viewController.m includere questa riga in viewDidLoad

 settingView.viewControllerDelegate=self 

L’etichetta non si sta aggiornando perché stai provando a chiamare il metodo updateLabel con una nuova istanza.

Dovresti chiamare updateLabel dell’istanza originale di viewcontroller da cui hai presentato la tua vista modale.

puoi usare un delegato mechansim o NSNotification per fare lo stesso.

Debind il mechnaismo sarebbe pulito. NSNotification è veloce e sporco.

Non stai esattamente chiamando la vc corretta. Questo perché stai creando una nuova istanza di quella class e chiamando l’ updateLabel di updateLabel .

Hai alcune opzioni.

  1. Implementarlo come delegate callBack (delegate messagePassing o delegate notification – comunque si voglia chiamarlo) per notificare a updateLabel della class di chiamare il metodo updateLabel .

  2. Usa l’istanza originale VC come dependency injection nella class in cui ti trovi ora, e usa updateLabel per chiamare l’ updateLabel

  3. Usa NSNotifications / NSUserDefaults per comunicare tra viewControllers e configurare un sistema di notifica per le tue azioni. Questo è abbastanza facile, ma non molto alla lunga.

Vorrei RACCOMANDARE l’opzione 1 (o) opzione 2.

Dichiarare semplicemente in questo modo nella class SettingsView:

  UILabel *lblInSettings;// and synthesize it 

Assegnare ora come sotto quando si presenta Settings viewController:

 settingsVC.lblInSettings=self.myLabel; 

Quindi qualunque cosa si aggiorni in lblInSettings sarà presente in MainView ovviamente …. non è necessario alcun metodo di delegato o metodi di aggiornamento.

 Means if you assign at the time of dismissing like [email protected]"My new value"; then self.myLabel also will be updated. 

Fammi sapere se hai qualche domanda?