我正在创建一个应用程序,从Flickr和Imgur使用他们的API提取图像。 在填充存储图像URL和图像标题的模型之后,我想重新加载UI,以便图像填充集合视图,但是当它被调用时,集合视图为零。
在负责使用API获取图像的类中调用此委托方法。
-(void)refreshUIOnMainThread
{
photosFromWeb = [libraryAPI getPhotos];
if([self.delegate respondsToSelector:@selector(reloadUIAfterImageDownload:)]) {
[self.delegate reloadUIAfterImageDownload:photosFromWeb];
}
}
委托方法在ViewController.m中定义,该类是调用reloadData时应调用UICollectionView委托函数的类。
-(void)reloadUIAfterImageDownload:(NSArray*)photosFromWeb
{
allPhotos = photosFromWeb;
NSLog(@"reloadUIAfterDelegate: Number of Photos in Photo Model: %lu\n",
(unsigned long)[allPhotos count]);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"about to reload collectionview...\n");
//collectionview is nil, so reloadData is not called???????
[self.collectionView reloadData];
});
}
最初我认为照片模型数组为0,意味着将填充0个单元格。
-(NSInteger)collectionView:(UICollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section
{
NSLog(@"numberofItemsInSection: Number of Photos in Photo Model: %lu\n",
(unsigned long)[allPhotos count]);
return ([allPhotos count]);
}
但事实并非如此。
NSLog(@"reloadUIAfterDelegate: Number of Photos in Photo Model: %lu\n",
(unsigned long)[allPhotos count]);
返回128的计数,表示Photo对象在那里,在调试器中,我发现collectionview在委托方法定义中有一个nil值。为什么会这样?
回购:https://github.com/danielv775/Flickr-Image-Gallery/tree/master/Photo%20Gallery 这些函数位于FlickrClient.m和ViewController.m
中答案 0 :(得分:1)
我现在看到了这个问题。它位于LibraryAPI.m
:
flickrClient = [[FlickrClient alloc]init];
vc = [[ViewController alloc]init];
flickrClient.delegate = vc;
您正在创建视图控制器的新实例,因此没有在此新实例上设置IBOutlet。相反,您需要像ViewController.m
那样设置您的委托:
- (void)viewDidLoad {
[super viewDidLoad];
LibraryAPI *libraryAPI = [LibraryAPI sharedInstance];
libraryAPI.flickrClient.delegate = self;
}
这假设您flickrClient
上有LibraryAPI
个属性。如果需要,您还可以在LibraryAPI
上添加委托属性。
注意:您还希望在flickrClient
上更改您的委托属性,如下所示:
@property (weak, nonatomic) id <FlickrClientDelegate> delegate;
代表不应该保持强有力的参考。