Хорошо, это странно.У меня есть одноэлементный класс, который загружает информацию из файла 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];
всегда называется.
есть идеи?