我正在创建这样的协议。
@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是我的委托方法,应该被调用。我没有收到这里的电话。 我去了我的第一堂课,我已经创建了我的协议,我打印了代表......这是零..
答案 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控制器。