2016-05-18 55 views
0

我正在制作一个应用程序,使用它们的API从Flickr和Imgur中提取图像。 在填充存储图像URL和图像标题的模型之后,我想重新加载UI,以便图像填充collectionview,但是当它调用collectionview时为零。collectionView当调用[self.collectionView reloadData]时,无法调用reloadData

在负责使用API​​提取图像的类中调用此委托方法。

-(void)refreshUIOnMainThread 
{ 
    photosFromWeb = [libraryAPI getPhotos]; 
    if([self.delegate respondsToSelector:@selector(reloadUIAfterImageDownload:)]) { 
    [self.delegate reloadUIAfterImageDownload:photosFromWeb]; 
    } 
} 

委托方法在ViewController.m,其中UICollectionView委托功能应当在给reloadData的调用来调用的类定义。

-(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]; 
    }); 

} 

本来我以为照片Model数组为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的计数,并在调试器我找到的CollectionView具有委托方法定义内的零值。为什么会这样呢?

回购:https://github.com/danielv775/Flickr-Image-Gallery/tree/master/Photo%20Gallery 这些功能在FlickrClient.m和ViewController.m

+0

你在哪里设置你的'collectionView'属性?它是否不是零?我假设这是'IBOutlet'未连接的情况。 – Mark

+0

我检查viewDidLoad,它不是零,它在viewController.h中设置为一个IB插座。 – danielv775

+0

你可以覆盖你的'collectionView'属性的setter吗?其中,您可以首先检查新值是否为零,并为该情况添加断点。然后你可以看到什么是你的财产设置为零。如果你愿意,我可以添加代码作为答案。 – Mark

回答

1

啊,我现在看到的问题。它坐落在这条线的LibraryAPI.m

flickrClient = [[FlickrClient alloc]init]; 
vc = [[ViewController alloc]init]; 
flickrClient.delegate = vc; 

您建立视图控制器的新实例,所以没有IBOutlets都建立在这个新的实例。相反,你需要从ViewController.m设置您的代理,像这样:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    LibraryAPI *libraryAPI = [LibraryAPI sharedInstance]; 
    libraryAPI.flickrClient.delegate = self; 
} 

这是假设你有你的LibraryAPI一个flickrClient属性。如果你愿意的话,你也可以在LibraryAPI上添加代理财产。

注意:您也想改变你的委托财产上flickrClient像这样:

@property (weak, nonatomic) id <FlickrClientDelegate> delegate; 

代表们不应该保持强劲的引用。

+0

谢谢!这解决了这个问题! – danielv775