2011-09-08 4 views
0

J'essaye de construire un délégué pour me permettre de transmettre des données d'un contrôleur de vue enfant au parent. J'ai regardé divers tutoriels/questions en ligne mais ma méthode de délégué n'est pas déclenchée. Pourriez-vous jeter un oeil à mon code ci-dessous et voir si quelque chose me manque?Pourquoi mon délégué personnalisé ne fonctionne-t-il pas?

TownListViewController.h

@protocol TownListViewControllerDelegate; 

@interface TownListViewController : UITableViewController <NSFetchedResultsControllerDelegate> { 

    id <TownListViewControllerDelegate> delegate; 

} 

@property (nonatomic, assign) id <TownListViewControllerDelegate> delegate; 

@end 

@protocol TownListViewControllerDelegate 
@optional 

- (void)didSelectTown:(Town *)town; 

@end 

TownListViewController.m

@implementation TownListViewController 

@synthesize delegate; 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [delegate didSelectTown:(Town *)[self.fetchedResultsController objectAtIndexPath:indexPath]]; 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

@end 

SearchViewController.h

@interface SearchViewController : UITableViewController <TownListViewControllerDelegate> { 

... 

} 

SearchViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    TownListViewController * townViewController = [[TownListViewController alloc] initWithNibName:@"TownListViewController" bundle:nil]; 
    townViewController.delegate = self; 
    [self.navigationController pushViewController:townViewController animated:YES]; 
} 

- (void)didSelectTown:(Town *)town 
{ 
    NSLog(@"didSelectTown fired"); 
    self.selectedTown = town; 
} 

Toute aide est très appréciée.

+2

Votre mise en œuvre des délégués est correcte. Je vérifierais toujours si le délégué répondToSelector bien que vous déclariez la méthode de délégué comme facultative ainsi si votre objet n'implante pas vous obtiendrez un plantage. Votre problème pourrait être dans le didSelectRowAtIndexpath - est-il définitivement appelé? – Rog

+0

Spot sur! La méthode que je pensais pousser le TownListViewController à la pile (didSelectRowAtIndexPath) n'était pas appelée à la place, elle était poussée par une autre méthode qui ne définissait pas le délégué. Sur une autre note, j'essaye d'ajouter le respondsToSelector, mais il se présente en disant "-respondsToSelector not found", des idées? –

+0

'if ([self.delegate respondsToSelector: @selector (didSelectTown :)]) {[self.delegate didSelectTown: ville];}' – Rog

Répondre

0

Essayez de reloadData après avoir défini le délégué. Je pense que le premier appel à reloadData de la table se produit au cours de la initWithNibName du TownListViewController ... vous pouvez poster Quoi qu'il en soit la valeur delegate sur cette méthode:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

Je parie est nul ...

Par façon est une bonne pratique pour vérifier si la delegate variables est conforme au protocole, essayez d'ajouter cette ligne sous supposant que la méthode est facultative:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if([delegate conformsToProtocol(TownListViewControllerDelegate)] && [delegate respondsToSelector:@selector(didSelectTown:objectAtIndexPath:)]) 
     [delegate didSelectTown:(Town *)[self.fetchedResultsController objectAtIndexPath:indexPath]]; 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

Merci pour votre commentaire. La solution à la fin était que le didSelectRowAtIndexPath qui définissait le délégué n'était pas appelé quand je m'attendais. En ce qui concerne votre conseil de bonne pratique, j'essaie d'ajouter le respondsToSelector, mais il apparaît en disant "-respondsToSelector not found", des idées? –

Questions connexes