2

我很难让我的子类PFCollectionViewCellPFImageView. 我正在使用 Storyboards 来安装我的 PA_ProfileCollectionViewCell。

我要做的就是加载图像(我可以从解析中成功获取),并将其分配给PFImageView我的自定义单元格中的 a 。我将不胜感激任何帮助/见解,可以帮助我用棒球棒猛击我的电脑,并在慢动作的荣耀中破坏我的办公室。

我想要的结果:有一个自定义单元格(的子类PFCollectionViewCell)供-collectionView:cellForItemAtIndexPath:object:

问题:我的自定义属性PFImageView *imageThumb(在我的子类上PFCollectionViewCell)不响应loadInBackground:或者是类setFile:上的两种方法PFImageView


为了清楚起见,这是我的代码:

- 我的自定义 PFCollectionViewCell:ProfileCollectionViewCell

@interface PA_ProfileCollectionViewCell : PFCollectionViewCell
@property (weak, nonatomic) IBOutlet PFImageView *imageThumb;
@end

- 在 vi​​ewDidLoad 中注册自定义类

- (void)loadView {
    [super loadView];
    [self.collectionView registerClass:[PA_ProfileCollectionViewCell class]
            forCellWithReuseIdentifier:_cellIdentifier];
}

- 设置单元格collectionView:cellForItemAtIndexPath:object
这是发生主要问题的地方。根据调用,我的单元格值已成功绘制为深灰色,cell.backgroundColor:但所有将图像分配给我的 imageThumb 的尝试都失败了。请注意,在下面的源代码中,我imageThumb不响应选择器loadInBackgroundor 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 上,这导致我尝试爬过我的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 上尝试了这个答案,这让我尝试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 的每个可行组合提供给所有需要 classNames 的方法PFQueryCollectionViewController。例如:我尝试了以下代码行,其中我用PA_ProfileCollectionViewCell,UICollectionViewCell和替换了所有 CLASSNAMEHERE 实例,所有实例PFCollectionViewCell都具有等量的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:调用,因为它没有通过 Parse 文档出现在 API 中(但我从来没有遇到错误,或者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 的建议,我使用了此处给出的建议,并将我的更改PFImageView *imageThumb为 a UIImageView *imageThumb,并尝试将返回的 NSdata 分配给getDataInBackground:withBlock:图像,这是我的代码片段(请注意,我确实得到了“得到数据! " 输出到控制台,但图像仍未显示):

// 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加载 a 的子类如此困难PFCollectionViewCell

提前感谢任何花时间帮助我的人!

4

2 回答 2

1

您面临的问题是您正在-viewDidLoad方法中注册类,但您正在通过情节提要中的原型单元格设置单元格。

如果您在此处参考“单元格和视图重用”部分,您将阅读(强调我的):

...如果单元格或补充视图是使用情节提要中的原型创建的,则无需在代码中注册该类,实际上,这样做会阻止单元格或视图在应用程序运行时出现

这就是您PFImageViews没有表现的原因,因为您在调用后破坏了您在 Storyboards 中建立的原型连接-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];  
于 2015-03-05T19:17:34.313 回答
0

PA_ProfileCollectionViewCell 有 NIB 文件吗?如果是,您需要注册 NIB 文件而不是类。尝试这样的事情:

// LOAD UP THE NIB FILE FOR THE CELL
UINib *nib = [UINib nibWithNibName:@"PA_ProfileCollectionViewCell" bundle:nil];

// REGISTER THE NIB FOR THE CELL WITH THE TABLE
[self.collectionView registerNib:nib forCellWithReuseIdentifier:@"CustomNibCellId"];
于 2015-03-04T18:16:07.020 回答