2012-04-04 99 views
4

我已经定义这将在下面示于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:

我加MasterViewController的DetailViewController里面的实例,但它没有工作:

- (void)viewDidLoad 
{ 
    [super viewDidLoad];  

    MasterViewController *master = [[MasterViewController alloc] init]; 
    master.delegate = self; 
} 

SOLUTION:

在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

你是否解决了这个问题?这吃了我的大脑。请让我知道你是否找到了解决办法? – GenieWanted 2013-09-16 13:24:26

回答

0

您从不显式声明自己是Consumer类的委托。只要遵守它就不会削减它。通过建立消费者的一个实例,可能是这样的声明它-viewDidLoad:

-(void)viewDidLoad { 
    Consumer *consumer = [[Consumer alloc]init]; 
    [consumer setDelegate:self]; 
} 

您还没有声明属性在消费者的委托对象,因此它可以实际上从未被访问。第一个这样做:

@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__]; 
} 
+0

但是,如何从didSelectRowAtIndexPath方法中调用didSelectCustomer委托。 – azamsharp 2012-04-04 21:39:40

+0

你正确地做到了这一点。你从来没有分配过一个委托,所以它永远不会工作。 – CodaFi 2012-04-04 21:42:17

+0

我的委托在MasterViewController文件中。所以从DetailViewController它应该是_masterViewController.delegate = self;但它不起作用。 – azamsharp 2012-04-04 21:44:30

0

拆分视图控制器的最后一个对象。

该对象返回一个UI导航控制器。

你知道的,那么你可以自己做。