PF ImageView无法处理PF CollectionViewCell的子类

时间:2015-03-04 17:13:55

标签: ios objective-c parse-platform pfimageview pfcollectionviewcell

我很难让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 中设置单元格 这是主要问题发生的地方。根据{{​​1}}调用,我的单元格值已成功绘制为darkGray,但所有将图像分配给imageThumb的尝试都失败了。请注意,在下面的源代码中,我的cell.backgroundColor:没有响应选择器imageThumbloadInBackground,这些选择器来自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()

我尝试过的其他事情:

我已经选择了ParseUIDemo上的源代码,但是他们所有的实现都使用了库存can cell.imageThumb loadInBackground? : 0 (NO) can cell.imageThumb setFile? : 0 (NO) 而没有任何自定义或子类化,所以我尝试调整我的项目来使用他们的方法,但我可以永远不会让事情在那里工作。

我已阅读this answer,在SO上,这导致我尝试抓取PFCollectionViewCellcell.contentViews.subviews寻找cell.subviews这两项尝试都没有成功:

PFImageView

然后我在SO上尝试了this answer,这让我尝试使用标记从我的故事板中抓取// [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; } } 的实例,这同样不成功。

PFImageView

最后,我将所有可行的classNames组合提供给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的所有方法。例如:我尝试了下面的代码行,我用PFQueryCollectionViewControllerPA_ProfileCollectionViewCellUICollectionViewCell替换了CLASSNAMEHERE的所有实例,所有这些实例都等量 FAIL

PFCollectionViewCell

更新#01:

根据用户@soulshined的建议,我尝试跳过// 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]; 来电,因为它没有出现在API via the Parse docs中(但我从未收到错误或setFile:使用时),所以我尝试了下面的代码片段,没有运气(注意unrecognized selector error如何被setFile:取代:

.file

更新#02

再次,根据@soulshined的建议,我used the advice give here,并将我的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; }]; } }]; 更改为PFImageView *imageThumb,并尝试将从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这么困难?

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

2 个答案:

答案 0 :(得分:1)

您遇到的问题是您在-viewDidLoad方法中注册了课程,但是您正在通过Storyboard中的Prototype单元格设置您的单元格。

如果你参考"Cell and View Reuse" section here,你会读到(强调我的):

  

...如果使用原型内创建单元格或补充视图   一个故事板,没有必要在代码中注册该类,并在   事实上,这样做会阻止细胞或视图出现时   应用程序运行

这就是为什么你的PFImageViews没有表现的原因,因为你在调用-registerClass:forCellWithReuseIdentifier:之后打破了你在Storyboards中建立的Prototype连接,并且你的PFImageViews在运行时停止了。

因此,要解决您的问题,只需从视图控制器中删除-registerClass:forCellWithReuseIdentifier

Et瞧,问题解决了......

因此,以下代码在视图控制器中的任何地方都不需要,因为如果您使用的是原型单元格,则无需注册该类:

// 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];  

答案 1 :(得分: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"];