好的 - 这个很奇怪。我有一个单例类,从XML文件加载信息。我使用委托定义如下(我在一个单独的头文件中定义委托,以使生活更轻松):
@protocol ResourceClassDelegate <NSObject>
@optional
- (void)picturesDidStartLoading;
- (void)picturesDidFinishLoading;
@end
在资源文件中,正确定义了委托(我相信):
@property (assign) id<ResourceClassDelegate> delegate;
使用委托时,资源类中的代码如下:
-(void)refreshPiecesOfHistoryWithOperation {
NSLog(@"Operation Started");
if ([delegate respondsToSelector:@selector(picturesDidStartLoading)])
[delegate picturesDidStartLoading];
self.picturePacks = [HistoryXMLParser loadPicturePacks];
[self.allPiecesOfHistory removeAllObjects];
// now lets put all of them in one big file...
for (PicturePack *pp in self.picturePacks) {
for (int ct = 0; ct < [[pp piecesOfHistory] count] ; ct++) {
[self.allPiecesOfHistory addObject:(PieceOfHistory *)[[pp piecesOfHistory] objectAtIndex:ct]];
}
}
NSLog(@"Operation Ended");
if ([delegate respondsToSelector:@selector(picturesDidFinishLoading)])
[delegate picturesDidFinishLoading];
}
现在......在正在侦听委托的类中,它被分配:
- (void)viewDidLoad {
[super viewDidLoad];
// now for the part that makes the loading all happen...
[[ResourceClass sharedResourceClass] setDelegate:self];
}
在听力课中,方法被定义....
#pragma mark ResourceClassDelegate
-(void)picturesDidStartLoading {
if (loadingActivity == nil)
loadingActivity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[self.view addSubview:loadingActivity];
[loadingActivity setCenter:[self.view center]];
[loadingActivity startAnimating];
}
-(void)picturesDidFinishLoading {
if (loadingActivity != nil) {
[loadingActivity stopAnimating];
[loadingActivity removeFromSuperview];
}
[self.tableView reloadData];
}
现在针对问题......每次在侦听类中调用方法(void)picturesDidFinishLoading。从未调用方法(void)picturesDidStartLoading。
当我调试代码时,在资源类中,行
if ([delegate respondsToSelector:@selector(picturesDidStartLoading)])
[delegate picturesDidStartLoading];
永远不会到达委托方法调用 - 即使我删除了if语句。这条线
if ([delegate respondsToSelector:@selector(picturesDidFinishLoading)])
[delegate picturesDidFinishLoading];
总是调用。
任何想法?
答案 0 :(得分:1)
好的 - 我想通了......
第一次通话时,代表是零。它是nil的原因是因为在init方法期间在源中调用了使用委托的函数。执行委托的第一次测试时,init方法未完成。此时委托是nil,因为在init方法完成之前它不会被实例化。委托的第二次测试工作的原因是因为我使用NSOperationQueue提交了流程。
要解决这个问题,我必须稍微改变一下......这都是关于时机的问题!
那么现在很有趣......
答案 1 :(得分:0)
这很奇怪,尝试删除协议声明中的@optional
,看看是否有警告。
尝试在方法中打印日志,除了它看起来很好。