2011-09-08 11 views
0

私は、子ビューコントローラから親にデータを渡すための代理人を構築しようとしています。私はオンラインで様々なチュートリアル/質問を見てきましたが、私のデリゲートメソッドは起動されていません。カスタムデリゲートが機能しないのはなぜですか?

私のコードを以下に見て、私が何かが欠けているかどうか確認できますか?

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

ご協力いただきありがとうございます。

+2

あなたのデリゲートの実装が正しいです。私はいつもデリゲートがrespondsToSelectorかどうかをチェックしますが、デリゲートメソッドをオプションとして宣言しているので、オブジェクトが実装されていないとクラッシュするでしょう。問題はdidSelectRowAtIndexpathにある可能性があります - 間違いなく呼び出されていますか? – Rog

+0

スポットがあります!私が思ったメソッドは、(didSelectRowAtIndexPath)スタックにTownListViewControllerをプッシュする代わりに、デリゲートを設定していなかった別のメソッドによってプッシュされていました。別のノートでは、respondsToSelectorを追加しようとしていますが、 "-respondsToSelector not found"というアイデアは何ですか? –

+0

'(self.delegate respondsToSelector:@selector(didSelectTown :)){{self.delegate didSelectTown:town;}' – Rog

答えて

0

デリゲートを設定した後に、データを再読み込みしようとします。私はとにかくあなたがこの方法でdelegate値を投稿することができます...テーブルのreloadDataの最初の呼び出しがTownListViewControllerのinitWithNibName中に発生したと思う:

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

私がnilである賭ける...

することにより方法は、変数delegateがプロトコルに準拠かどうかを確認することをお勧めします、方法は任意であると仮定の下で、この行を追加してみてください:

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

ご意見ありがとうございます。最後の解決策は、私が期待しているときに代理人を設定したdidSelectRowAtIndexPathが呼び出されていないということでした。あなたの良い練習のヒントに関しては、respondsToSelectorを追加しようとしていますが、 "-respondsToSelector not found"というアイデアは何ですか? –

関連する問題