我很难让我的PFCollectionViewCell
子类与PFImageView
很好地配合使用。 我正在使用Storyboard组装我的PA_ProfileCollectionViewCell。
我要做的就是加载图像(可以从解析中成功获取图像),并将其分配给自定义单元格中的PFImageView
。我将不胜感激,因为有任何帮助/见解,可以帮助我用棒球棍砸我的电脑,并把我的办公室丢在慢动作的光辉中。
我期望的结果:有一个自定义单元格(PFCollectionViewCell
的子类)供-collectionView:cellForItemAtIndexPath:object:
使用
问题:我的自定义属性PFImageView *imageThumb
(在PFCollectionViewCell
的子类上)不响应loadInBackground:
或setFile:
,这是PFImageView
类的两个方法。
为了清楚起见,这是我的代码:
-我的自定义PFCollectionViewCell:ProfileCollectionViewCell
@interface PA_ProfileCollectionViewCell : PFCollectionViewCell
@property (weak, nonatomic) IBOutlet PFImageView *imageThumb;
@end
-在viewDidLoad 中注册自定义类
- (void)loadView {
[super loadView];
[self.collectionView registerClass:[PA_ProfileCollectionViewCell class]
forCellWithReuseIdentifier:_cellIdentifier];
}
-以
collectionView:cellForItemAtIndexPath:object
设置单元格这是发生主要问题的地方。按
cell.backgroundColor:
调用,我的单元格值已成功涂成深灰色,但所有将图像分配给我的imageThumb的尝试均失败。请注意,在下面的源代码中,我的imageThumb
不响应选择器loadInBackground
或setFile
,它们与PFImageView
一起提供。-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath
object:(PFObject *)object {
PA_ProfileCollectionViewCell *cell = (PA_ProfileCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:_cellIdentifier
forIndexPath:indexPath];
cell.backgroundColor = [UIColor grayColor];
// Load the photo
PFFile *pingThumb = [object objectForKey:@"imageMediumFile"];
if (pingThumb){
BOOL canLoadInBackground = [cell.imageThumb respondsToSelector:@selector(loadInBackground:)];
BOOL canSetFile = [cell.imageThumb respondsToSelector:@selector(setFile:)];
NSLog(@"can cell.imageThumb loadInBackground? : %hhd", canLoadInBackground);
NSLog(@"can cell.imageThumb setFile? : %hhd", canSetFile);
[cell.imageThumb setFile:pingThumb];
[cell.imageThumb loadInBackground:^(UIImage *image, NSError *error) {
if(!error){
NSLog(@"CODE WON'T REACH THIS POINT.");
NSLog(@"loadInBackground doesn't exist on cell.imageThumb)");
[UIView animateWithDuration:0.2f animations:^{
cell.imageThumb.alpha = 1.0f;
}];
}
}];
}
return cell;
}
上面的代码片段中所有
NSLog()
语句的输出为:can cell.imageThumb loadInBackground? : 0 (NO)
can cell.imageThumb setFile? : 0 (NO)
我尝试过的其他方法:
我已经选择了ParseUIDemo上的源代码,但是它们的所有实现都使用了
PFCollectionViewCell
库存,没有进行任何自定义或子类化,因此我尝试调整项目以使用其方法,但是我也无法在此工作。我已在SO上阅读了this answer,这使我尝试遍历
cell.contentViews.subviews
和cell.subviews
以查找PFImageView
均未成功:// [DIDN'T WORK]
for (UIView *subview in cell.contentView.subviews) {
if ([subview isKindOfClass:[PFImageView class]]) {
NSLog(@"Yay! I found a PFImageView"); // Never gets called
break;
}
}
然后我在SO上尝试了this answer,这使我尝试使用一个标签从我的情节提要中获取
PFImageView
实例,但同样没有成功。PFImageView *photoView = (PFImageView *)[cell.contentView viewWithTag:242];
if(!photoView) NSLog(@"Can't find PFImageView with tag in Storyboards");
// -> Can't find PFImageView with tag in Storyboards
最后,我将每种可行的classNames组合提供给
PFQueryCollectionViewController
中所有需要classNames的方法。例如:我尝试了以下几行代码,其中我用PA_ProfileCollectionViewCell
,UICollectionViewCell
和PFCollectionViewCell
交换了CLASSNAMEHERE的所有实例,所有这些实例都使用了相等数量的 FAIL :// the cell (with casting)
CLASSNAMEHERE *cell = (CLASSNAMEHERE *)[cv dequeueReusableCellWithReuseIdentifier:...];
// the cell (without casting)
CLASSNAMEHERE *cell = [cv dequeueReusableCellWithReuseIdentifier:...];
// registering the class
[self.collectionView registerClass:[CLASSNAMEHERE class]
forCellWithReuseIdentifier:_cellIdentifier];
更新#01:
根据用户@soulshined的建议,我尝试跳过
setFile:
调用,因为它没有出现在API via the Parse docs中(但是我从没有收到错误,或者在使用时没有unrecognized selector error
),所以我尝试了以下代码段,没有祝您好运(请注意,如何将setFile:
替换为.file
:cell.imageThumb.file = pingThumb;
//[cell.imageThumb setFile:pingThumb];
[cell.imageThumb loadInBackground:^(UIImage *image, NSError *error) {
if(!error){
NSLog(@"CODE WON'T REACH THIS POINT.");
NSLog(@"loadInBackground doesn't exist on cell.imageThumb)");
[UIView animateWithDuration:0.2f animations:^{
cell.imageThumb.alpha = 1.0f;
}];
}
}];
更新#02
再次,根据@soulshined的建议,我used the advice give here,并将
PFImageView *imageThumb
更改为UIImageView *imageThumb
,并尝试将从getDataInBackground:withBlock:
返回的NSdata分配给图像,这是我的代码段(请注意,我确实获得了“Got Data!”输出到控制台,但图像仍未显示):// pingThumb is a PFFile
[pingThumb getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
if (!error) {
NSLog(@"Got data");
UIImage *image = [UIImage imageWithData:data];
[cell.imageThumb setImage:image];
}
}];
有人能想到我所缺少的步骤吗?为什么要通过子类
PFImageView
加载PFCollectionViewCell
如此困难?在此先感谢您抽出宝贵时间来帮助我!
最佳答案
您面临的问题是您正在-viewDidLoad
方法中注册该类,但是您正在通过Storyboard中的Prototype单元设置单元。
如果您参考"Cell and View Reuse" section here,您将阅读(强调我):
...如果单元格视图或补充视图是使用其中的原型创建的
故事板,无需在代码中注册 class ,并且
实际上,这样做会阻止单元格或视图在
应用程序运行。
这就是为什么PFImageViews
无法运行的原因,因为在调用-registerClass:forCellWithReuseIdentifier:
之后,您中断了在情节提要中建立的原型连接,并且在运行时环境中丢失了PFImageViews。
因此,要解决您的问题,只需从视图控制器中删除-registerClass:forCellWithReuseIdentifier
。
等等,问题解决了...
因此,您的视图控制器中的任何地方都不需要下面的代码,因为同样,如果您使用的是原型单元,则无需注册该类:
// Not needed when using Prototype cells in Storyboards!
[self.collectionView registerClass:[PA_ProfileCollectionViewCell class]
forCellWithReuseIdentifier:_cellIdentifier];
删除registerClass代码后,上面问题代码示例中与
PFImageView
一起使用的代码就可以正常工作。希望这会有所帮助!
附带说明,在
-collectionView:cellForItemAtIndexPath:object
中实例化自定义单元时,无需强制转换// this is all you need
SomeCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:_cellId];
// the casting example below is redundant and unnecessary, stick with the top example
SomeCustomCell *cell = (SomeCustomCell *)[collectionView dequeueReusableCellWithReuseIdentifier:_cellId];
关于ios - PF ImageView在PF UICollectionViewCell的子类上不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28860672/