问题:
- collectionview 的header会重复添加。
- collectionview 的header数据错乱。
-
tableView的header倒是没有什么问题,但是今天在使用collectionview设置header的时候就出现问题了。
-
刚开始我用的系统的UICollectionReusableView 那么就会出现一个问题,在header 的地方你每次刷新他都会初始化一个 view ,打开界面一看我擦,好多个headerView 重叠在一起了,于是查了大佬们的方法,看到都是说判断这个view 的subviews.count 如果为0那么就添加你要添加的子视图。对这样是解决了重叠的问题。
-
但是问题又来了,当你刷新的时候,你会发现你的headerView上面的数据错乱了,此时就应该是headerView 的复用的问题了。复用了之后直接将子视图也复用了,所以导致数据没有根据自己的indexPath.section 去赋值。整了半天没有明白怎么回事,然后就自定义了一个header,完美搞定。
代码:
// headerView 的.m 文件。这个没有说的 .h 就一个属性
#import "CarcorderHeaderView.h"
@implementation CarcorderHeaderView
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self){
self.backgroundColor = [[UIColor alloc] initWithRed:1 green:1 blue:1 alpha:0.95];
[self createLab];
}
return self;
}
- (void)createLab{
self.headerLab = [TaoUI createLableWithText:nil backgroundColor:nil textColor:UIColorFromRGB(0x666666) font:16.0 numberOfLines:0 textAlignment:NSTextAlignmentLeft boderColor:nil];
[self addSubview:self.headerLab];
[self.headerLab mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(15);
make.right.top.bottom.equalTo(self);
}];
}
@end
collectionview 注册headerView
[self.collectionView registerClass:[CarcorderHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerV"];
接下来在collectionview 的代理方法中操作headerView;
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
CarcorderHeaderView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerV" forIndexPath:indexPath];
// if (self.dataArr.count == 0) return view; 这里之前没有注意,直接return view 的话 刷新会看到这个view,通过下面处理就行了。
if (self.dataArr.count == 0){
view.backgroundColor = [UIColor clearColor];
return view;
}
// 这里就随便你怎么写了。我这个很简单只是一个日期的展示。。OK ,headerView 重复添加的问题搞定,数据错乱的问题搞定。
NSString *timeStr = ((YourModel*)self.dataArr[indexPath.section][indexPath.row]).startTime
view.headerLab.text = timeStr;
}
希望有好办法的朋友给个连接。
希望能帮助遇到过同样问题的小伙伴吧。。
---来自涛胖子的工作笔记
网友评论