代表里面的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];
你在上面使用伊娃,而不是通过财产。 因此delegate
是nil.
所以,如果您尝试使用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]; } }