UICollectionViewCell未正确设置属性

时间:2015-03-13 13:20:47

标签: ios objective-c uicollectionview uicollectionviewcell reloaddata

我正在尝试创建包含少量属性的自定义UICollectionViewCell,并且取决于在单元格内绘制组件的那些属性的值。我使用dequeueReusableCellWithReuseIdentifier来创建单元格,然后我设置了一些属性,并在最后调用layoutIfNeeded函数,该函数在我的自定义单元格中被覆盖。重写函数也是设置单元格的一些属性,例如BOOL属性设置为YES,刷新单元格(在集合视图上调用reloadData)后再次调用函数layoutIfNeeded。当我尝试读取设置为YES的BOOL属性时,我总是得到默认值,这是第一次调用reloadData时为NO。当我第二次调用reloadData时,属性设置为YES。知道我做错了什么吗?这是我正在使用的代码:

按钮点击

我正在呼叫:

[myCollectionView reloadData];

方法cellForItemAtIndexPath看起来像:

MyCustomCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"myCustomCell" forIndexPath: indexPath];
cell.device = [collectionArray objectAtIndex:indexPath.row];
[cell layoutIfNeeded];
return cell;

layoutIfNeeded

MyCustomCollectionCell.m的代码
-(void)layoutIfNeeded{
    NSLog(@"bool prop: %d",changedStatus);
    changedStatus = YES;

}

BOOL属性在MyCustomCollectionCell.h

中定义
@property (nonatomic, assign)BOOL changedStatus;

更新:

对不起,我在帖子中犯了一个错误。我没有使用reloadData刷新收藏,而是reloadItemsAtIndexPaths;此调用导致我的自定义单元格的init方法再次被调用(不仅仅是在第一次加载集合视图时)以及之后layoutIfNeeded。我的问题是,单元格不会被重用,但会再次创建,导致所有属性都消失。知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

您不能使用单元格来存储状态数据。单元格被使用,放入重用队列,然后再循环。存储特定indexPath数据的特定单元格对象可能会在重新加载表时,重新加载单元格,滚动显示新单元格等时更改。

将状态数据保存在数据模型中。

答案 1 :(得分:0)

changedStatus属性的目的是什么?

尝试在changedStatus = YES;中设置layoutSubviews

- (void)layoutSubviews
{
    [super layoutSubviews];
    self.changedStatus = YES;
}

答案 2 :(得分:0)

在ViewController中设置此changedStatus Bool而不是UICollectionViewCell。

BOOL属性在YourViewController.h中定义:

@property (nonatomic, assign)BOOL changedStatus;

当您想要刷新CollectionView

[myCollectionView reloadData];
changedStatus = YES;

然后在MyCustomCollectionCell.m内创建一个新方法,

-(void)customLayoutIfNeeded : (BOOL)status{
    NSLog(@"bool prop: %d",changedStatus);
    changedStatus = YES;

}

也将此添加到MyCustomCollectionCell.h

然后在cellForItemAtIndexPath内执行此操作,

MyCustomCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"myCustomCell" forIndexPath: indexPath];
cell.device = [collectionArray objectAtIndex:indexPath.row];
[cell customLayoutIfNeeded: changedStatus];
return cell;