[英]Obj-C Delegate inside Delegate
我将一个用作我的视图的子类化为子视图,它内部有一些按钮委托,并且效果很好。
但是我在我的viewController上面展示了一个modalViewController。 (在我的modalViewController中,我已经实现了相同的header,并且确实从该header中获取了委托),但是如果按下了header的后退按钮,则它本身必须将该视图委托给先前的viewController。
我已经做了相同的功能,但是我的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>
我不明白我在这里想念的是什么:-/请让我看看吗? 如果需要更多信息,我会添加询问。
编辑:
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
我们试试吧:
- (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];
}
}
nmh的答案是正确的。 我之前写了一个答案,但是他的回答更快,所以我认为我会去掉其他部分,并在此处添加说明。
你有这个:
@interface allEventsDrillPage : UIViewController
{
id<allEventsDrillPageDelegate> __weak delegate;
....
}
@property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate;
使用此id<allEventsDrillPageDelegate> __weak delegate;
您声明一个ivar。
使用此@property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate;
您正在声明财产。
从Xcode 4.4开始,您将获得自动合成功能。 所以这行:
_drillPage.delegate = self;
您正在通过属性设置一个。
而不是这样:
id<allEventsDrillPageDelegate> __weak delegate;
所以你在这里有什么:
[delegate allEventsDrillPage:self backbuttonPressed:sender];
您正在使用上面的ivar,而不是通过属性使用的。 因此, delegate
nil.
因此,如果您尝试使用nmh的解决方案向代理发送消息,或者:
[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;
}];
}
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.