在XCode 4.3.2中的主 - 详细信息应用程序模板(使用ARC,故事板)中,当我选择主表视图中的项目时,我试图更改(更具体地说是替换)详细视图。我正在尝试为此实现委托/协议。
我感到困惑的是 - 哪个类应该实现协议中定义的方法 - 主或详细信息?
让详细视图实现协议方法对我来说很有意义,因为我将根据选择在详细视图中推送/弹出视图控制器(通过协议方法从master传递为字符串)。
这是我试过的
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
}
在此过程中,在主表中选择行时,没有任何反应。没有崩溃,没有显示日志,也没有建立错误。我在这里想念的是什么?
答案 0 :(得分:0)
您需要设置委托属性 - 此时它将为零,因此当您向其发送消息时没有任何反应。在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;
}