我将一个用作我的视图的子类化为一个子视图,它内部有一些按钮委托,并且效果很好。
但是我在我的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
最佳答案
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;
}];
}
希望这可以帮助。
关于ios - Obj-C委托(delegate)内部委托(delegate),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23310786/