我在Customer.h文件中定义了协议,如下所示:
@class Customer;
@protocol CustomerDelegate <NSObject>
-(void) didSelectCustomer:(Customer *) customer;
@end
@interface Customer : NSObject
{
}
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *occupation;
@end
MasterViewController(左侧)调用didSelectCustomer方法,如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Customer *selectedCustomer = [customers objectAtIndex:[indexPath row]];
[self.delegate didSelectCustomer:selectedCustomer];
}
现在,我需要告诉DetailViewController(右侧)做些什么。 DetailViewController符合CustomerDelegate协议。
@interface DetailViewController : UIViewController<UISplitViewControllerDelegate,CustomerDelegate>
{
}
-(void) didSelectCustomer:(Customer *)customer
{
NSLog(@"sssdasdasdasd");
}
永远不会调用didSelectCustomer方法。我想我需要设置masterViewController.delegate = self,但我不知道在哪里设置这个东西。
更新1:
我在DetailViewController中添加了MasterViewController的实例,但它不起作用:
- (void)viewDidLoad
{
[super viewDidLoad];
MasterViewController *master = [[MasterViewController alloc] init];
master.delegate = self;
}
解决方案:
在AppDelegate中:
else
{
UISplitViewController *splitViewController = (UISplitViewController *) self.window.rootViewController;
splitViewController.delegate = [splitViewController.viewControllers lastObject];
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
// splitViewController.delegate = (id)navigationController.topViewController;
DetailViewController *detail =(DetailViewController *) [splitViewController.viewControllers lastObject];
UINavigationController *masterNavigationController = [splitViewController.viewControllers objectAtIndex:0];
MasterViewController *master = (MasterViewController *)masterNavigationController.topViewController;
master.delegate = detail;
}
答案 0 :(得分:0)
您从未明确声明自己是Consumer类的委托。仅仅符合它不会削减它。通过创建Consumer的实例在-viewDidLoad中声明它,可能是这样的:
-(void)viewDidLoad {
Consumer *consumer = [[Consumer alloc]init];
[consumer setDelegate:self];
}
您也不会在Consumer中为您的委托对象声明属性,因此永远不会实际访问它。首先这样做:
@class Customer;
@protocol CustomerDelegate <NSObject>
-(void) didSelectCustomer:(Customer *) customer;
@end
@interface Customer : NSObject
{
}
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *occupation;
@property (weak) id <CustomerDelegate> delegate; //use assign or __unsafe_unretained if targeting <5.0.
@end
您可以检查您的班级是否符合您的协议:
if (![delegate conformsToProtocol:@protocol(CustomerDelegate)]) {
[NSException raise:@"Delegate Exception"
format:@"Parameter does not conform to CustomerDelegate protocol at line %d", (int)__LINE__];
}
答案 1 :(得分:0)
拆分视图控制器的最后一个对象。
此对象返回UI导航控制器。
你知道,那你就可以自己做。