自定义委托返回nil值

时间:2013-12-28 05:13:22

标签: ios objective-c

我正在创建这样的协议。

   @protocol parsingComplete <NSObject>
   @optional
     -(void) updateUI:(NSMutableDictionary*)foodList;
   @end

   @interface foodParser:NSObject<NSXMLParserDelegate>

   @property(nonatomic, weak) id<parsingComplete> delegate;
   @end

解析完成后,我想要触发此委托。所以我正在做这样的事情。

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    if (delegate) 
    {
        [delegate updateUI:food];
    }
 }

此处委托值为nil。任何人都能理解这个问题的根源。

我正在调用我的代表。 这是.h文件 {

 @interface NHMainViewController : UIViewController<parsingComplete>

 @property(nonatomic, strong)ATAFoodParser *foodParser;
 @end

}

这里是.m文件

{

@implementation NHMainViewController

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
 {
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
      if (self) {
       // Custom initialization
      }
      return self;
}

- (void)viewDidLoad
{
     [super viewDidLoad];
     self.foodParser = [[ATAFoodParser alloc] init];
     self.foodParser.delegate = self;
// Do any additional setup after loading the view.
 }


-(void) updateUI:(NSMutableDictionary*)foodList{
       NSLog(@"Dictionary:---->%@", foodList);
 }

@end

}

updateUI是我的委托方法,应该被调用。我没有收到这里的电话。 我去了我的第一堂课,我已经创建了我的协议,我打印了代表......这是零..

2 个答案:

答案 0 :(得分:4)

您的问题似乎是您没有将“foodParser”作为属性或实例变量保留:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    ATAFoodParser *foodParser = [[ATAFoodParser alloc] init]; 
    foodParser.delegate = self; 
}

foodParser”是一个局部变量,只要“viewDidLoad”完成,它就会消失(或由ARC释放)。

要解决此问题,如果在NHMainViewController的.h文件中设置属性,例如

@property (strong) ATAFoodParser * foodparser;

然后,您可以将“viewDidLoad:”中的该行更改为:

self.foodParser = [[ATAFoodParser alloc] init]; 
self.foodparser.delegate = self;

你应该好好去。

答案 1 :(得分:0)

我想,你有点混乱。

我举例说明delegate如下。

1)在.h文件中,@interface FirstViewController : UIViewController<parsingComplete>

并且您的委托方法实现应该在.m file中。

2)然后你创建了secondviewController,你必须这样做

SecondViewController *second = [[SecondViewController alloc] init];
second.delegate = self;

从第一个视图控制器,您可以推送或显示第二个视图控制器。 现在你排在第二位。如果你想先与第一个进行通信,请像你一样通过委托从secondView控制器调用firstView控制器。

注意:请查看此beer bottle examplestack reference.