我已经将一个视图子类化为我用作标题视图的视图,它有一些按钮委托给它,它完美无缺。
但是我在viewController上面呈现了一个modalViewController。 (在我的modalViewController中,我已经实现了相同的标题,它确实从标题中获取了委托)但是如果按下标题的后退按钮,它自己必须委托给前一个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
答案 0 :(得分:3)
试试吧:
- (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];
}
}
答案 1 :(得分:2)
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,而不是通过该属性的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;
}];
}
希望这有帮助。