我正在尝试创建包含少量属性的自定义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
。我的问题是,单元格不会被重用,但会再次创建,导致所有属性都消失。知道如何解决这个问题吗?
答案 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;