我将一个用作我的视图的子类化为一个子视图,它内部有一些按钮委托,并且效果很好。

但是我在我的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。
因此delegatenil.
因此,如果您尝试使用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/

10-16 23:34