代表里面的Obj-C代表

我已经subclassed视图,我使用的标题视图它有一些button委托里面,它的作品完美。

不过,我在我的viewController上面提出了一个modalViewController。 (在我的modalViewController中,我已经实现了相同的头文件,并且它从头文件中获取委托),但是如果按下了头文件的后退button,它必须委托给前一个viewController。

我做了相同的function,但我的viewController从来没有得到它的代表… :(我是相当新的Obj-C,我不知道也许我在这里做一些非法的事情。

这里是modalViewController试图委托给以前的viewController的代码

#pragma mark - header delegate - (void)header:(header *)header backbuttonPressed:(UIButton *)sender { if(header == logo) { NSLog(@"gotBackButtonDelegate"); //delete the items array //_itemSourceArray = nil; [delegate allEventsDrillPage:self backbuttonPressed:sender]; [self dismissViewControllerAnimated:YES completion:nil]; } } 

这个委托从页眉视图触发。

不过在我以前的viewController中:

 - (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender //doesn't work :( { NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); // [self dismissViewControllerAnimated:YES completion:nil]; _drillPage = nil; } 

永远不会被召唤

我这样调用modalViewController:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [_allEventsTableView deselectRowAtIndexPath:indexPath animated:YES]; [self->_allEventsTableView setNeedsDisplay]; [self->_allEventsTableView reloadData]; _drillPage = [[allEventsDrillPage alloc]initWithDictionary:((NSDictionary*) [_tableDataSource objectAtIndex:indexPath.row])]; _drillPage.delegate = self; [self presentViewController:_drillPage animated:YES completion:nil]; } 

在我的.h文件中

 @interface allEvents : UIViewController <headerDelegate , UITableViewDataSource , UITableViewDelegate ,allEventsDrillPageDelegate> 

我不明白我在这里错过了什么: – /可以some1看看吗? 如果需要更多的信息,我将添加只是要求它。

编辑:

在modalViewController里面的委托协议

 @class allEventsDrillPage; @protocol allEventsDrillPageDelegate //define delegate protocol - (void)allEventsDrillPage:(allEventsDrillPage*)allEventsDrillPage backbuttonPressed:(UIButton*)sender; @end @interface allEventsDrillPage : UIViewController { id<allEventsDrillPageDelegate> __weak delegate; .... } @property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate; //define 

nmh的答案是正确的。 我早些时候写了一个答案,但他来得更快,所以我想我会拿出其他部分,只是在这里添加解释。

你有这个:

 @interface allEventsDrillPage : UIViewController { id<allEventsDrillPageDelegate> __weak delegate; .... } @property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate; 

有了这个id<allEventsDrillPageDelegate> __weak delegate; 你宣布一个伊娃。

用这个@property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate; 你正在声明一个属性。

由于Xcode 4.4,你可以自动合成。 所以这一行:

 _drillPage.delegate = self; 

你正在设置一个通过财产。

而不是这个:

 id<allEventsDrillPageDelegate> __weak delegate; 

所以你在这里:

 [delegate allEventsDrillPage:self backbuttonPressed:sender]; 

你在上面使用伊娃,而不是通过财产。 因此delegatenil.

所以,如果您尝试使用nmh的解决scheme向代理发送消息,或者:

 [self.delegate allEventsDrillPage:self backbuttonPressed:sender]; 

它应该按预期工作。

解雇模态视图控制器的补遗:

不要从当前的视图控制器中解散它,而是从提交它的人那里解除它,所以:

 - (void)header:(header *)header backbuttonPressed:(UIButton *)sender { if(header == logo) { NSLog(@"gotBackButtonDelegate"); [_delegate allEventsDrillPage:self backbuttonPressed:sender]; //or self.delegate } } 

在:

 - (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender { NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); [self dismissViewControllerAnimated:YES completion:nil]; _drillPage = nil; } 

甚至更好:

 - (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender { NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); [self dismissViewControllerAnimated:YES completion:^{ _drillPage = nil; }]; } 

希望这可以帮助。

咱们试试吧:

 - (void)header:(header *)header backbuttonPressed:(UIButton *)sender { if(header == logo) { NSLog(@"gotBackButtonDelegate"); // delete the items array //_itemSourceArray = nil; // my comment: you should replace "delegate" to "_delegate" // and it works. I tested. It's OK. Wow. [_delegate allEventsDrillPage:self backbuttonPressed:sender]; [self dismissViewControllerAnimated:YES completion:nil]; } }