2012-05-08 4 views
1

XCode 4.3.2でマスターディテールアプリケーションテンプレート(ARC、ストーリーボードを使用)でマスターの項目が変更されたとき(詳細に置き換える)テーブルビューが選択されています。私はこれの代理人/プロトコルを実装しようとしています。iOS Master-Detail app:プロトコルとデリゲートを定義する

私が混乱しているのは、どのクラスがプロトコルマスターまたは詳細で定義されたメソッドを実装すべきかです。

詳細ビューの実装では、プロトコルメソッドを使用してマスターからの文字列として渡された選択に基づいて詳細ビューでプッシュ/ポップするようになりました。ここ

私は

1)

DetailViewController.hにMasterViewController.m

@synthesize delegate; 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [delegate masterSelectionChanged:@"Some string based on indexPath.row"]; 
} 

3)MasterViewController.h

@protocol MasterViewDelegate <NSObject> 
- (void)masterSelectionChanged:(NSString *)selection; 
@end 
@interface MasterViewController:UIViewContoller 
@property (nonatomic, weak) id <MasterViewDelegate> delegate 

2)プロトコルを定義しようとしたものです

#import "MasterViewController.m" 
@interface DetailViewController:UINavigationController <MasterViewDelegate> 
@end 

4)この方法で

#pragma mark - MasterViewDelegate 
- (void)masterSelectionChanged:(NSString *)selection 
{ 
    NSLog(@"the selection is: %s", selection); 
    // WIll push/pop view over here, may be perform segues based on selection 
} 

DetailViewController.m

で、マスター表の行を選択すると、何も起こりませんでした。クラッシュしたり、ログを表示したり、ビルド中にエラーが発生したりすることはありません。私はここで何を見逃しましたか?

+0

1)あなたは(マスター/詳細テンプレートは、それぞれ1で非常に異なっている)、iPadやiPhoneについて話している2 )デリゲートプロパティを実際にどこに設定したのか、それとも定義しただけですか? – jrturton

+0

@jrturton - iPad用にこれを試しています。 'delegate'プロパティを定義していますか?それが私が逃したものかもしれません。デリゲートプロパティはどこで定義する必要がありますか? – vikmalhotra

答えて

0

デリゲートプロパティを設定する必要があります。デリゲートプロパティを設定する必要はありません。メッセージを送信するときに何も起こりません。次のようにあなたの詳細ビューコントローラのviewDidLoadで、これを行うことができますiPadのテンプレートで:

[super viewDidLoad]; 
if (self.splitViewController) // Means this won't be called if you use this code on iPhone too. 
{ 
    // According to comments your master controller is embedded in a nav controller 
    UINavigationController *nav = (UINavigationController*)[self.splitViewController.viewControllers objectAtIndex:0]; 
    // I am assuming it is the root view controller 
    MasterViewController *master = (MasterViewController*)nav.rootViewController; 
    // Finally set the delegate 
    master.delegate = self; 
} 
+0

私はこれを試しましたが、プロトコルで定義されたメソッドはまだ呼び出されていません。行が選択されると、デリゲートはnilになります。 – vikmalhotra

+0

上記のコードで代入後にmaster.delegateを記録するとどうなりますか?:NSLog(@ master:%@代理人:%@ self:%@ "、master、master.delegate、self);' – jrturton

+0

- 'マスター:デリゲート: self:' – vikmalhotra

関連する問題