Obj-C委托代表内部

时间:2014-04-26 12:20:17

标签: ios objective-c delegates

我已经将一个视图子类化为我用作标题视图的视图,它有一些按钮委托给它,它完美无缺。

但是我在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 

2 个答案:

答案 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。 因此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;
     }];
}

希望这有帮助。