0

我试图创建自定义UICollectionViewCell,其中包含几个属性,并取决于绘制组件内部单元的属性的值。我使用dequeueReusableCellWithReuseIdentifier来创建单元格,然后我设置一些属性,并在最后调用layoutIfNeeded函数,这个函数在我的自定义单元格内被覆盖。重写功能是设置单元格的某些属性,例如BOOL属性设置为YES,刷新单元格后(在集合视图上调用reloadData)函数layoutIfNeeded被再次调用。当我尝试阅读我设置为YES的BOOL属性时,我总是得到默认值,这是我第一次拨打reloadData时的NO。当我第二次拨打reloadData时,属性设置为YES。任何想法我做错了什么?这里是代码我使用:UICollectionViewCell未正确设置属性

按钮点击我打电话:

[myCollectionView reloadData]; 

方法cellForItemAtIndexPath样子:

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

而且里面MyCustomCollectionCell.m

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

} 

layoutIfNeeded代码BOOL属性在中定义:

@property (nonatomic, assign)BOOL changedStatus; 

UPDATE:

我很抱歉,我在我的岗位上做出了一个错误。我不喜欢收集reloadData,但与reloadItemsAtIndexPaths;这个调用会导致我的自定义单元格的init方法再次被调用(不仅仅是当收集视图第一次被加载时),并且在那之后调用它的方法layoutIfNeeded。我的问题是单元格没有被重用,但是再次创建,导致所有属性消失。任何想法如何解决这个问题?

+0

您可以指定在(与调用'-reloadData')你在读'changedStatus'? – 2015-03-13 13:31:39

+0

'reloadData'在'viewController'类中被调用,'changedStatus'被设置并被打印在'MyCustomCollectionCell'里面。首先在'layoutIfNeeded'方法中调用'reloadData',然后调用'cellForItemAtIndexPath'方法,在'layoutIfNeeded'里面调用'changedStatus'方法,然后设置新的值。 – AleksandarNS 2015-03-13 13:36:42

+1

兄弟我刚刚创建了一个空白项目并复制你的代码并粘贴到我的项目中。只是在@implementation之后添加了一行。合成changedStatus。并且工作得很好。不知道为什么,但工作。 – 2015-03-13 13:40:44

回答

0

changedStatus属性的用途是什么?

尝试layoutSubviews而不是设置changedStatus = YES;

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

我有更复杂的系统,其中包含5个NSString属性和3个BOOL属性,我将在稍后阅读。根据这8个属性的值,当用户按下按钮时,不同的内容被更新并呈现。如果应用@synthesize,为什么我需要使用self属性来读取它? – AleksandarNS 2015-03-13 13:43:20

+0

@DuncanC答案是最好的,你应该在你的单元格外使用你的模型,它只是用来显示模型。 'self.'访问器只是我的编码风格:) – ryancrunchi 2015-03-13 13:49:12

2

不能使用电池来存储状态数据。单元格被使用,放入重用队列中,然后被回收。存储特定indexPath的数据的特定单元格对象可能会在表格重新加载时,单元格重新加载时,滚动以显示新单元格等时发生更改。

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

+0

为什么我在第二次按下按钮后得到正确的值?每次我获得正确的价值,第一次除外。如果单元格可见或不可见,则不相关。第二次按下后,它总是正确设置。 – AleksandarNS 2015-03-13 13:39:25

0

将此changedStatus布尔设置在您的ViewController而不是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;