在实例化单元格之前调用 UICollectionView 委托方法?
Posted
技术标签:
【中文标题】在实例化单元格之前调用 UICollectionView 委托方法?【英文标题】:UICollectionView Delegate method gets called before cell is instantiated? 【发布时间】:2014-03-04 01:07:31 【问题描述】:我正在实现一个 UICollectionView,它通过 Parse 从在线获取数据。我正在将图像加载到集合视图中。我遇到的问题是集合视图的委托方法之一在重新加载单元格之前被调用。
我有一个方法可以将背景中的对象加载到 NSArray 中。一旦他们都完成了,我重新加载我的收藏视图。从那里我的委托方法在collectionView:cellForItemAtIndexPath
之前被调用。我的委托方法处理每个单独单元格的大小,以便它们可以根据照片的大小进行更改。
这是一个问题,因为单元格中需要包含图像才能让我看到它们对于委托方法的大小。
我的委托方法如下所示:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(NHBalancedFlowLayout *)collectionViewLayout preferredSizeForItemAtIndexPath:(NSIndexPath *)indexPath
CustomCollectionViewCell *currentCell = (CustomCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
if (currentCell)
return [currentCell.cellImage.image size];
return [cellImage size];
就像我说的,这个委托方法在collectionView:cellForItemAtIndexPath
之前被调用。这导致局部变量“currentCell”返回 nil。我该怎么做才能正确设置它,以便在加载所有单元格后调用委托?
【问题讨论】:
【参考方案1】:我在 Parse 表视图中可能也遇到了同样的情况。关于解析集合和表格视图如何设置它们的尺寸,您是绝对正确的。上传图片的时候保存图片的宽高可以解决这个问题。这样,您可以在 PFFile 图像完成下载之前获取图像的尺寸(这通常发生在设置集合视图之后)。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
MyParseImage *image = [self.objects objectAtIndex:indexPath.row];
CGFloat imageHeight = [[image objectForKey:height] floatValue];
CGFloat imageWidth = [[image objectForKey:width] floatValue];
CGFloat ratio = self.view.frame.size.width / imageWidth;
return imageHeight * ratio;
【讨论】:
非常感谢您回来!你是如何在 Parse 上保存图像尺寸的?你能将它保存为 CGSize 对象还是单独保存高度/宽度? 是的,我将宽度和高度分别保存为 NSNumber 对象。它想看看[myParseImage setObject:imageWidth forKey:width]
,然后像往常一样用[myParseImage saveInBackground]
保存它。
我实际上仍然有这个问题。问题是为了从 PFFile 中检索图像,您必须通过块加载它。加载该块后,我就可以访问该图像。从那里我可以得到宽度/高度。问题是您不能从块中返回值。有什么想法吗?
您是否在解析数据库中的图像类中添加了宽度和高度字段?
是的,我已经这样做了,我可以访问它们,但是为了获得这些属性,您需要在后台使用块加载数据。你不能从一个块中返回一个值,所以我得到它后不能设置它。以上是关于在实例化单元格之前调用 UICollectionView 委托方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 中动态更改 UICollectionView 单元格高度