代理中的Obj-C委派 [英] Obj-C Delegate inside Delegate

查看:136
本文介绍了代理中的Obj-C委派的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



然而,我在我上面介绍了一个modalViewController, viewController。
(在我的modalViewController中,我已经实现了相同的标题,并且它从标题中获取了代理),但是如果按下了标题的后退按钮,那么它自己的这个视图必须委托给以前的viewController。 >

我已经做了相同的功能,但我的viewController从来没有得到它的委托... :(
我是相当新的Obj-C,我不知道也许我在这里做一些非法的事情。



这里是modalViewController尝试委托给以前的viewController的代码

  #pragma mark  -  header delegate 
- (void)header:(header *)header backbuttonPressed:(UIButton *)sender
{
if(header ==标记)
{
NSLog(@gotBackButtonDelegate);
//删除项数组
// _ itemSourceArray = nil;
[委托allEventsDrillPage:self backbuttonPressed: sender];
[self dismissViewControllerAnimated:YES completion:nil];
}
}

这个委托从标题视图中触发。



我以前的viewController:

   - (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender // doesn' t工作:( 
{
NSLog(@取回代理!!!!!!!!!!!!!!!!!!!!!!!!!!!!! );
// [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> 

我没有得到我在这里缺少的东西: - /可以some1看看吗?
如果需要更多信息我将添加只是要求它。



编辑:



modalViewController内的委托协议

  @class allEventsDrillPage; 
@protocol allEventsDrillPageDelegate // define delegate protocol
- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender;
@end
@interface allEventsDrillPage:UIViewController
{
id< allEventsDrillPageDelegate> __weak代表
....
}
@property(weak,nonatomic)id< allEventsDrillPageDelegate>代表; //定义


解决方案

nmh的答案是正确的。我早些时候写了一个答案,但他来得更快,所以我以为我会拿出其他部分,只是在这里添加说明。



你有这个: p>

  @interface allEventsDrillPage:UIViewController 
{
id< allEventsDrillPageDelegate> __weak代表
....
}
@property(weak,nonatomic)id< allEventsDrillPageDelegate>代表;

使用这个 id< allEventsDrillPageDelegate> __weak delegate; 你声明一个ivar。



使用这个 @property(weak,nonatomic)id< allEventsDrillPageDelegate>委托; 您正在声明一个属性。



由于Xcode 4.4可以自动合成。
所以这一行:

  _drillPage.delegate = self; 

您正通过该属性设置一个。



而不是这样:

  id< allEventsDrillPageDelegate> __weak代表

所以你在这里:

  [delegate allEventsDrillPage:self backbuttonPressed:sender]; 

您正在使用上述ivar,而不是通过该属性。
委托因此 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];
//或self.delegate
}
}

in:

   - (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender 
{
NSLog(@取回代理!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! );
[self dismissViewControllerAnimated:YES completion:nil];
_drillPage = nil;
}

甚至更好:



($)$($)$($)$($)$($)$($)$($)$ {code $ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!);
[self dismissViewControllerAnimated:YES完成:^ {
_drillPage = nil;
}];
}

希望这有帮助。


I have subclassed a view that I am using as header view it has some buttons delegate inside it and it works perfect .

However I am presenting a modalViewController above my viewController . (in my modalViewController I have implemented the same header , and it does get the delegates from the header) but this view it self has to delegate to the previous viewController if the back button of the header is pressed.

I have made the same functions but my viewController never gets it's delegate... :( I am quite new to Obj-C and I don't know maybe I am doing something illegal here.

here is the code of modalViewController trying to delegate to the previous 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];
    }
}

This delegate does triggers from the header view.

however in my previous viewController:

- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender //doesn't work :(
{
    NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
//    [self dismissViewControllerAnimated:YES completion:nil];
    _drillPage = nil;
}

never get called

I calling the modalViewController like this:

- (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];
}

in its .h file I did

@interface allEvents : UIViewController <headerDelegate , UITableViewDataSource , UITableViewDelegate ,allEventsDrillPageDelegate>

I don't get what am I missing here :-/ can some1 take a look please ? if needed more info I will added just ask for it.

EDIT:

protocol of delegate inside the 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's answer is correct. I wrote up an answer earlier but his came in faster, so I thought I would take out the other parts and just add the explanations here.

You have this:

@interface allEventsDrillPage : UIViewController
{    
   id<allEventsDrillPageDelegate> __weak delegate;
   ....
}
@property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate;

With this id<allEventsDrillPageDelegate> __weak delegate; you declare an ivar.

With this @property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate; you are declaring a property.

Since Xcode 4.4 you get auto-synthesization. And so this line:

_drillPage.delegate = self;

You are setting the one via the property.

And not this:

id<allEventsDrillPageDelegate> __weak delegate;

So what you have here:

[delegate allEventsDrillPage:self backbuttonPressed:sender];

You are using the ivar above, not the one via the property. And delegate is thus nil.

And so, if you try to send a message to the delegate using nmh's solution or:

[self.delegate allEventsDrillPage:self backbuttonPressed:sender];

It should work as expected.

Addendum to dismissing modal view controller:

Instead of dismissing it from the current view controller, dismiss it from the one who presented it, so:

- (void)header:(header *)header backbuttonPressed:(UIButton *)sender
{
    if(header == logo)
    {
        NSLog(@"gotBackButtonDelegate");
        [_delegate allEventsDrillPage:self backbuttonPressed:sender]; 
        //or self.delegate
    }
}

And in:

- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender
{
    NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    [self dismissViewControllerAnimated:YES completion:nil];
    _drillPage = nil;
}

Or even better:

- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender 
{
     NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
     [self dismissViewControllerAnimated:YES completion:^{
         _drillPage = nil;
     }];
}

Hope this helps.

这篇关于代理中的Obj-C委派的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆