Délégation d'implémentation

Je pense que je suis la façon dont la délégation fonctionne, voici le tutoriel que j'ai suivi , mais je fais des bêtises quelque part. J'attends mon délégué à NSLog mais ce n'est pas le cas. Quelqu'un peut-il savoir ce qui me manque ou mal faire?

Mon MainViewController.h :

@interface MainViewController : UITableViewController < AddClassDelegate > 

MainViewController.m :

 - (void)cancelAddingClass { NSLog(@"Canceled Yo"); } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { /* When a row is selected, the segue creates the detail view controller as the destination. Set the detail view controller's detail item to the item associated with the selected row. */ if ([[segue identifier] isEqualToSsortingng:@"addClassSegue"]) { UINavigationController *nc = (UINavigationController *)segue.destinationViewController; AddClassViewController *addClassVC = (AddClassViewController *)[nc.viewControllers objectAtIndex:0]; addClassVC.delegate = self; } 

Mon controller de vue modale AddClassViewController.h :

 @protocol AddClassDelegate <NSObject> - (void)cancelAddingClass; @end @interface AddClassViewController : UITableViewController @property (weak, nonatomic) id< AddClassDelegate > delegate; - (IBAction)cancelButtonPressed:(id)sender; 

AddClassViewController.m :

 @synthesize delegate; - (IBAction)cancelButtonPressed:(id)sender { [self.delegate cancelAddingClass]; } cancelButtonPressed: 

est accroché au button Annuler de la vue modale dans Storyboard.

Votre code semble correct, ce qui suggère que le problème est quelque part que nous ne pouvons pas voir. Ma conjecture est ici:

 AddClassViewController *addClassVC = [segue destinationViewController]; addClassVC.delegate = self; NSLog(@"segued"); 

Avez-vous embedded votre controller de vue modale dans un controller de navigation? Si c'est le cas, destinationViewController vous donne le controller de navigation, pas le AddClassViewController. Vérifiez quelle class addClassVC se trouve réellement dans le débogueur.

S'il s'agit d'un controller de navigation, pas de problème, il vous suffit d'accéder à votre VC réel en utilisant la propriété .viewControllers . Sur plusieurs lignes pour le rendre plus simple à comprendre:

 UINavigationController *nc = (UINavigationController *)segue.destinationViewController; AddClassViewController *addClassVC = (AddClassViewController *)[nc.viewControllers objectAtIndex:0]; addClassVC.delegate = self; 

Vous pouvez le faire en less de lignes mais c'est un désordre de casting et de parenthèses nestedes, ce qui est plus difficile à déboguer.

Est-il possible que votre controller de vue principale soit publié? Cela mettrait la reference faible à nil et le message que vous envoyez à votre délégué serait simplement ignoré parce que vous enverriez un message nil .

Tout est parfait. Je n'ai vu aucun problème. Gardez les points de rupture partout et déboguez-le.