我很难让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:
没有响应选择器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()
我已经选择了ParseUIDemo上的源代码,但是他们所有的实现都使用了库存can cell.imageThumb loadInBackground? : 0 (NO)
can cell.imageThumb setFile? : 0 (NO)
而没有任何自定义或子类化,所以我尝试调整我的项目来使用他们的方法,但我可以永远不会让事情在那里工作。
我已阅读this answer,在SO上,这导致我尝试抓取PFCollectionViewCell
和cell.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的所有方法。例如:我尝试了下面的代码行,我用PFQueryCollectionViewController
,PA_ProfileCollectionViewCell
和UICollectionViewCell
替换了CLASSNAMEHERE的所有实例,所有这些实例都等量 FAIL :
PFCollectionViewCell
根据用户@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
再次,根据@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
这么困难?
提前感谢任何花时间帮助我的人!
答案 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"];