1

XCode 4.3.2のマスター/詳細アプリケーションテンプレート(ARC、ストーリーボードを使用)で、マスターテーブルビューのアイテムが選択されたときに詳細ビューを変更(より具体的には置換)しようとしています。このためにデリゲート/プロトコルを実装しようとしています。

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

詳細ビューにプロトコルメソッドを実装させることは私にとって理にかなっています。なぜなら、選択に基づいて(プロトコルメソッドを介してマスターから文字列として渡される)詳細ビューでビューコントローラーをプッシュ/ポップするからです。

これが私が試したことです

1)MasterViewController.hでプロトコルを定義しました

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

2)MasterViewController.mで

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

3)DetailViewController.h内

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

4)DetailViewController.mで

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

このプロセスでは、マスターテーブルの行を選択しても何も起こりませんでした。クラッシュもログの表示も、ビルド中のエラーもありません。ここで何が恋しかったですか?

4

1 に答える 1

0

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

[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;
}  
于 2012-05-08T10:57:10.693 に答える