出列后自定义 UICollectionViewCell 属性为空

Posted

技术标签:

【中文标题】出列后自定义 UICollectionViewCell 属性为空【英文标题】:Custom UICollectionViewCell properties are null after dequeueing 【发布时间】:2015-12-23 17:49:45 【问题描述】:

所以我有一个 UICollectionView 和一个自定义单元格,它们都显示出来并且效果很好。我在 viewDidLoad 中注册了这个类:

myCollectionView = [[UICollectionView alloc] initWithFrame:collectionViewFrame collectionViewLayout:layout];
[myCollectionView setDataSource:self];
[myCollectionView setDelegate:self];
[myCollectionView setBackgroundColor:[UIColor myColor]];
[myCollectionView registerClass:[SBCustomCell class] forCellWithReuseIdentifier:@"Cell"];

在我的 cellForItemAtIndexPath 方法中,我将单元格出列并设置其属性并返回它:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

static NSString *identifier = @"Cell";

SBCustomCell *cell= [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

[cell setName: "My Name"];
cell.image = [UIImage imageNamed:@"lol.png"];
cell.score = 100.0;
cell.backgroundColor=[UIColor whiteColor];

return cell;

这一切都很好,它会显示在 UI 中。我的问题是当我在 collectionView 上设置手势识别器时,当我长按某个单元格时,我希望能够访问它的属性。我正在尝试这样做:

-(void)handleLongPress:(UILongPressGestureRecognizer *)longPressRecognizer 

CGPoint locationPoint = [longPressRecognizer locationInView:myCollectionView];

if (longPressRecognizer.state == UIGestureRecognizerStateBegan) 

    NSIndexPath *indexPathOfMovingCell = [myCollectionView indexPathForItemAtPoint:locationPoint];

    SBCustomCell *cell= [myCollectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPathOfMovingCell];

    NSLog(@"%@",cell.name);

当我尝试访问我的任何自定义单元格的属性时,它在控制台中为 (null)。这是为什么?我做错了什么?

【问题讨论】:

【参考方案1】:

你需要使用:

SBCustomCell* cell = (SBCustomCell*)[myCollectionView cellForItemAtIndexPath:indexPathOfMovingCell];

代替:

SBCustomCell* cell = [myCollectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPathOfMovingCell];

另外,您使用SBSingleCandidateUnitView 作为单元格类型,而不是您的SBCustomCell

【讨论】:

嗨,迈克,感谢您的回复。实际上,我确实将它作为 SBCustomCell 使用,我只是在编辑用于 *** 的代码而忘记更改该代码。我的问题是为什么我不使用出队方法?我想取回自定义单元格而不是通用 UICollectionView 单元格。通用单元格没有我设置的自定义属性。 @stellarowl12:您不使用出队,因为这会为您提供一个“新”单元格以添加到集合视图中。即使该方法返回 UICollectionViewCell,您也可以将其转换为实际的单元格类型。我已经更新了我的答案以显示这一点。 所以我投了它并且没有错误或警告,但是当我尝试使用 NSLog 打印出我在 cellForItemAtIndexPath 中设置的任何自定义单元格的属性时,它们仍然打印为 Null。 ...知道为什么会这样吗?我是不是放错地方了? @stellarowl12:对不起,我想我不能真正给你任何准确的想法,为什么它会这样做。我认为,调试是你最好的选择。 所以只是为了澄清。我可以在 cellforitematindexpath 中使用出队的东西,但不能在 handleLongPress 方法中使用,对吧?【参考方案2】:

这是因为我没有正确设置我的属性。在我的头文件中,我需要设置一个属性,也就是 @property ... UIImageView myImageView;

在我的 CustomCell.m 文件中,我不应该覆盖那些 setter 和 getter。相反,只需分配并初始化它们并将它们添加到视图中。

回到我的 ViewController.m 我应该添加这样的属性:

customcell.myImageView.image = [UIImage imageNamed:@"cartman.png"];

【讨论】:

以上是关于出列后自定义 UICollectionViewCell 属性为空的主要内容,如果未能解决你的问题,请参考以下文章

坐标更改后自定义标记不重新渲染

使用 UISearchbar 和过滤后自定义新表

登录后自定义语言环境重定向 - Spring Security

断开/重新连接后自定义接收器不调用 onLoad

在 fabricjs 对象上应用 JSON.stringify 后自定义属性丢失

将数据从对话框插入 SQLi 后自定义列表视图不刷新