gpt4 book ai didi

ios - 调用 [self.collectionView reloadData] 时 collectionView nil,不调用 reloadData

转载 作者:行者123 更新时间:2023-11-29 00:58:47 26 4
gpt4 key购买 nike

我正在制作一个应用程序,使用 Flickr 和 Imgur 的 API 提取图像。填充存储图像 URL 和图像标题的模型后,我想重新加载 UI,以便图像填充 collectionview,但是当它被调用时,collectionview 为零。

在负责使用 API 获取图像的类中调用此委托(delegate)方法。

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

委托(delegate)方法在 ViewController.m 中定义,在该类中,在调用 reloadData 时应调用 UICollectionView 委托(delegate)函数。

-(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 在委托(delegate)方法定义中具有 nil 值。为什么会这样?

仓库: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;

您正在创建 View Controller 的新实例,因此没有在这个新实例上设置任何 IBOutlet。相反,您需要像这样从 ViewController.m 设置您的委托(delegate):

- (void)viewDidLoad {
[super viewDidLoad];

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

这假设您的 LibraryAPI 上有一个 flickrClient 属性。如果需要,您还可以在 LibraryAPI 上添加委托(delegate)属性。

注意:您还想像这样更改 flickrClient 上的委托(delegate)属性:

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

委托(delegate)人不应维护强引用。

关于ios - 调用 [self.collectionView reloadData] 时 collectionView nil,不调用 reloadData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37289286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com