繁体   English   中英

Obj-C委托内部委托

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM