10

abgewiesen wurde Ich arbeite mit dem Delegaten, während die Daten vom modalen zum präsentierenden View-Controller übertragen werden. Der präsentierende View-Controller zeigt jedoch nicht die Daten an, die er vom Modal empfängt. Ich schaute auf andere Beiträge und sie sagen, die Delegate/Protokoll-Methode zu verwenden, aber nicht erklären, wie/warum die Präsentation VC aktualisiert. Ich nehme an, mein Delegat ist falsch eingerichtet. Was ist die Methode zum Aktualisieren der Daten? Ich habe überprüft und die ViewWillAppear und ViewDidAppear wird nicht aufgerufen.Aktualisieren von Daten in einem UIViewController, nachdem der präsentierte Modal-View-Controller über den Delegaten

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 (Modal 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

Was haben Sie nach dem Aufstehen die richtige Referenz in Ihrem Delegaten. – Zen

+0

@Zen Yup, es tut mir leid, dass ich euch alle bedrückt habe. Aus irgendeinem Grund dachte ich, dass es letzte Nacht in meinem müden Zustand "magisch" aktualisiert werden würde. Ich muss Code hinzufügen, um es zu aktualisieren. – guptron

Antwort

6

Ich glaube, Sie fast da ist. EDIT - nur gelernt, here, dass ViewWillAppear Verhalten unterscheidet sich in iOS> 5. Sie möchten dennoch, dass die Ansicht Ihre Ansicht mit Ihrem Modellstatus aktualisiert, da dies bei der ersten Präsentation erforderlich ist.

Und es ist in Ordnung, es entweder von Ihrem modalen VC oder von innerhalb der Delegate-Methode aufzurufen. So fügen Sie den Code zu viewWillAppear, die die Ansicht aktualisiert mit dem Zustandsmodell des View-Controller ...

// 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]; 
} 

Dann entweder aus dem präsentierten vc oder den Delegierten, rufen viewViewWillAppear:

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

Dank dan, habe ich die Änderungen vorgenommen, und einen Haltepunkt in ViewWillAppear setzen, aber es trifft es nicht. – guptron

+0

Ich war mir einer Verhaltensänderung in iOS nicht bewusst. Siehe meine Bearbeitung. – danh

+0

Yup, Hinzufügen von Code zur Delegate-Methode funktioniert. Vielen Dank. – guptron

2

Sie Ihre UI nach dem Einstellen des "Kunden" nachladen sollten

- (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

Vielen Dank. Es hat wie ein Zauber für mich funktioniert. – Manthan

+0

Was würde Code sein, UI neu zu laden, die keine Tabellenansicht verwendet, d. H. Nur Textbeschriftungen? – user1904273

+0

ZB so etwas wie label.text = customer.name –