collectionView当调用[self.collectionView reloadData]时,无法调用reloadData
我正在制作一个应用程序,使用它们的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
啊,我现在看到的问题。它坐落在这条线的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;
代表们不应该保持强劲的引用。
谢谢!这解决了这个问题! – danielv775
你在哪里设置你的'collectionView'属性?它是否不是零?我假设这是'IBOutlet'未连接的情况。 – Mark
我检查viewDidLoad,它不是零,它在viewController.h中设置为一个IB插座。 – danielv775
你可以覆盖你的'collectionView'属性的setter吗?其中,您可以首先检查新值是否为零,并为该情况添加断点。然后你可以看到什么是你的财产设置为零。如果你愿意,我可以添加代码作为答案。 – Mark