调用[self.collectionView reloadData]时,collectionView为nil,reloadData不称为

时间:2016-05-18 02:34:21

标签: ios objective-c uicollectionview

我正在创建一个应用程序,从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

1 个答案:

答案 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;

代表不应该保持强有力的参考。