10

ho delegato a lavorare come i dati vengono passati dalla modal al controller della vista presentazione. Ma il controller della vista che presenta non mostra i dati che riceve dal modale. Ho guardato in altri posti e dicono di utilizzare il metodo delegato/protocollo, ma non spiegano come/perché il VC presentando rinfresca. Suppongo che il mio delegato sia impostato in modo errato. Altrimenti, qual è il metodo per aggiornare i dati? Ho controllato e viewWillAppear e viewDidAppear non vengono richiamati.Aggiornamento dei dati in un UIViewController Dopo aver respinto il suo controller di vista modale presentata tramite delegato

SCCustomerDetailVC.h (Presenting VC)

#import "SCCustomersVC.h" 

@interface SCCustomerDetailVC : UIViewController <SCCustomersVCDelegate> 

@property (atomic, strong) SCCustomer *customer; 
@property (strong, nonatomic) IBOutlet UIButton *changeCustomerButton; 

- (IBAction)changeCustomerButtonPress:(UIButton *)sender; 

@end 

SCCustomerDetailVC.m (Presenting VC)

- (IBAction)changeCustomerButtonPress:(UIButton *)sender 
{  
    UINavigationController *customersNC = [self.storyboard instantiateViewControllerWithIdentifier:@"customersNC"]; 
    SCCustomersVC *customersVC = (SCCustomersVC *)customersNC.topViewController; 
    customersVC.delegate = self; 
    [self presentViewController:customersNC animated:YES completion:nil]; 
} 

//Protocol methods 
- (void)passCustomer:(SCCustomer *)customer 
{ 
    self.customer = customer; 

    //At this point, self.customer has the correct reference 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

SCCustomersVC.h (modale VC)

#import "SCCustomersVCDelegate.h" 

@class SCCustomerDetailVC; 

@interface SCCustomersVC : UIViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate> 

@property (weak, nonatomic) id <SCCustomersVCDelegate> delegate; 

@end 

SCCustomersVC.m (Modal VC)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SCCustomer *customer = [self customerAtIndexPath:indexPath]; 
    [self.delegate passCustomer:customer]; 
} 

SCCustomersVCDelegate.h

@class SCCustomer; 

@protocol SCCustomersVCDelegate <NSObject> 
@optional 

- (void)passCustomer:(SCCustomer *)customer; 

@end 
+0

Cosa hai fatto dopo aver ottenuto il riferimento corretto nel tuo delegato. – Zen

+0

@Zen Yup, mi dispiace per turbare tutti voi per questo. Per qualche ragione, ho pensato che sarebbe "magicamente" aggiornato da sola la scorsa notte nel mio stato di stanchezza. Devo aggiungere il codice per aggiornarlo. – guptron

risposta

6

Penso che tu sia quasi arrivati. EDIT - appena saputo che il comportamento here viewWillAppear è diverso in iOS> 5. Vorresti comunque visualizzare la vista per aggiornare la visualizzazione con lo stato del modello, poiché è necessario farlo nella presentazione iniziale.

Ed è bene chiamarlo tramite il proprio vc modale o dall'interno del metodo delegato. Quindi aggiungere il codice per viewWillAppear che aggiorna la vista con il modello dello stato del controller della vista ...

// SCCustomerDetailVC.m 
- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    // making up an IBOutlet called someLabel 
    // making up a model method (description) that returns a string representing your model 
    self.someLabel.text = [self.customer description]; 
} 

Allora o dal vc presentati o il delegato, chiamare viewViewWillAppear:

- (void)passCustomer:(SCCustomer *)customer 
{ 
    self.customer = customer; 
    [self viewWillAppear:YES]; 
    [self dismissViewControllerAnimated:YES completion:^{}]; 
} 
+1

Grazie danh, ho apportato le modifiche e impostato un punto di interruzione in viewWillAppear ma non lo colpisce. – guptron

+0

Non ero a conoscenza di un cambio di comportamento in iOS. Vedi la mia modifica. – danh

+0

Sì, aggiungendo codice al metodo delegato lavorato. Grazie. – guptron

2

Si dovrebbe ricaricare l'interfaccia utente dopo aver impostato il "cliente"

- (void)passCustomer:(SCCustomer *)customer 
{ 
    self.customer = customer; 

    //At this point, self.customer has the correct reference 

    [self dismissViewControllerAnimated:YES completion:^{ 
      // reload your UI here or call a method which will reload your ui 
      // e.g. for tableView it will be [tableView reload]; 
     }]; 
} 
+0

Grazie mille. Ha funzionato come un fascino per me. – Manthan

+0

Quale sarebbe il codice per ricaricare l'interfaccia utente che non utilizza una vista tabella, ad esempio solo etichette di testo? – user1904273

+0

E.g qualcosa di simile a questo label.text = customer.name –