我正在尝试使用CollectionView自定义单元格,我需要从集合视图单元格自定义类本身更新单元格。
这是自定义单元格类
Cell_Obj.h
#import <UIKit/UIKit.h>
@interface Cell_Obj : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UILabel *label;
- (void)changeImage;
- (void)updateTextLabelName:(NSString*)str;
@end
Cell_Obj.m
#import "Cell_Obj.h"
static NSString *labelTxt ;
@implementation Cell_Obj{
}
+ (void)initialize {
if (self == [Cell_Obj class]) {
labelTxt = [[NSString alloc] init];
}
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
- (void)awakeFromNib {
_label.text = labelTxt;
[NSTimer scheduledTimerWithTimeInterval:2.0f
target:self
selector:@selector(updateLabel)
userInfo:nil
repeats:YES];
}
- (void)updateLabel
{
NSString * txt = [NSString stringWithFormat:@"%@",labelTxt];
_label.text = txt;
}
- (void)updateTextLabelName :(NSString*)str
{
labelTxt = str;
}
@end
在viewCotroller中我添加像
这样的单元格- (void)addCell
{
Cell_Obj *cell = [[Cell_Obj alloc] init];
NSString * txt = [NSString stringWithFormat:@"%d",[GridArray count]];
[cell updateTextLabelName: txt];
[GridArray addObject:cell];
[_collection insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:[GridArray count]-1 inSection:0]]];
}
上面代码的问题是,当我添加第一个单元格时,第一个单元格的标签为0,这很好,但是当我添加第二个单元格并且定时器调用发生时,cell1和cell2都具有标签值1。应该分别有0,1。
似乎单元对象在已经创建的单元格上发生任何更新时共享静态变量,就像计时器事件一样。
为什么会发生这种情况,我的做法是否有任何错误?
请告诉我你宝贵的建议。
修改
根据以下答案,我将静态变量作为实例变量
移动@implementation Cell_Obj{
NSString *labelTxt ;
}
但updateLabel
labelTxt
内部为零。我调试updateTextLabelName
之前调用的updateLabel
和labelTxt
具有正确值的位置。
答案 0 :(得分:1)
由于它是一个静态变量,它由所有单元实例共享。 使其工作的方法是从labelTxt定义中删除静态。
另外,它是静态的意义是什么?如果是由于计时器,只需在进行更新之前检查标签不为空的计时器方法,这将解决您的所有问题。
答案 1 :(得分:1)
这是因为collectionview会重新启动单元格以提高内存效率。因此,当它消灭细胞时它会调用awakeFromNib
。因此,您应该使用集合视图datasource methods
来更新或设置集合视图控件的内容。您应该实施cellForItemAtIndexPath
来设置标签中的数据!!