我很难让我的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不响应选择器loadInBackgroundsetFile,它们与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.subviewscell.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_ProfileCollectionViewCellUICollectionViewCellPFCollectionViewCell交换了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/

10-13 04:23