iOS9下UICollectionViewCell的awakeFromNib问题
最近项目测试出一个隐藏已久的bug,经过多番测试,发现在iOS9下自定义的一个UICollectionViewCell只走一次awakeFromNib。
具体情况是,项目中有一个控制器用到了自定义的UICollectionView,有四组数据,然而有三组自定义的UICollectionViewCell布局和子控件是一样的,所以只注册了两种类型的cell
#import <UIKit/UIKit.h> @interface YimaiDoctorGroupMoreTopicCollectionView : UICollectionView + (instancetype)collectionViewWithObject:(id)object; @end
#define kCollectionviewHeight 96.0
#define kCommonIdentifier @"YimaiDoctorGroupMoreTopicCommonCollectionCell"
#define kMyIdentifier @"YimaiDoctorGroupMoreTopicMyCollectionCell"
#import "YimaiDoctorGroupMoreTopicCollectionView.h" @implementation YimaiDoctorGroupMoreTopicCollectionView
static NSString const *commonIdentifier = @"YimaiDoctorGroupMoreTopicCommonCollectionCell";
static NSString const *myIdentifier = @"YimaiDoctorGroupMoreTopicMyCollectionCell"; + (instancetype)collectionViewWithObject:(id)object
{
//流水布局
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
CGFloat itemHeight = kScreenH - kCollectionviewHeight - kNavigtaionHeight;
layout.itemSize = CGSizeMake(kScreenW, itemHeight);
layout.minimumLineSpacing = ;
layout.minimumInteritemSpacing = ; //初始化
YimaiDoctorGroupMoreTopicCollectionView *collection = [[YimaiDoctorGroupMoreTopicCollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
//注册
[collection registerNib:[UINib nibWithNibName:kCommonIdentifier bundle:nil] forCellWithReuseIdentifier:kCommonIdentifier];
[collection registerNib:[UINib nibWithNibName:kMyIdentifier bundle:nil] forCellWithReuseIdentifier:kMyIdentifier];
//分页
collection.pagingEnabled = YES;
//数据源,代理
collection.delegate = object;
collection.dataSource = object;
//
collection.backgroundColor = [UIColor clearColor];
return collection;
} @end
在所属控制器的数据源方法中,初始化和赋值
#pragma mark - UICollectionViewDelegate
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return ;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier;
if (indexPath.item < ) {
identifier = @"YimaiDoctorGroupMoreTopicCommonCollectionCell";
YimaiDoctorGroupMoreTopicCommonCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
cell.type = [NSString stringWithFormat:@"%ld",indexPath.item + ];
FLOG(@"cell ======== %@", cell);
return cell;
}else{
identifier = @"YimaiDoctorGroupMoreTopicMyCollectionCell";
YimaiDoctorGroupMoreTopicMyCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
cell.type = (int)indexPath.item + ;
return cell;
}
}
每个自定义的UICollectionViewCell里面添加了UITableView作为子控件,并且能上拉加载,下拉刷新,所以有一些初始化
#pragma mark - life cycle
- (void)awakeFromNib {
[super awakeFromNib];
//设置tableview
[self setTableViewAttributes];
self.page = ;
}
当前控制器里顶部还加了资格按钮,用来点击可以实现UICollectionView的滑动
上面是核心源码,看似很正确的实现,最后却验证在iOS9下“不能滑动”,即看似下面这句话不执行
[self.collectionView setContentOffset:CGPointMake(index * kScreenW, ) animated:NO];
最后通过各种系统版本机型的调试,验证了,上面的这句setContentOffset没有问题,有问题的是,iOS9上YimaiDoctorGroupMoreTopicCommonCollectionCell的awakeFromNib方法只执行了一次,而在其他的手机版本下走了三次,所以导致当初注册的两种类型的cell,这里三种看似相同的cell现在都是完全一样了,数据都一样。类似于是用的同一个地址,而不是我们认为的,三种长得一样的cell都拥有自己独立的地址,所以才导致看着是没滑动,具体为什么还在不同的系统版本上有这种情况,查了资料也没什么头绪,有了解的伙伴们还请多多指点!!最后只附上解决方法:三种看似相同的cell不复用了,于是有了下面重用标识符的修改
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier;
if (indexPath.item < ) {
identifier = [NSString stringWithFormat:@"%@-%ld",@"YimaiDoctorGroupMoreTopicCommonCollectionCell", indexPath.item];
YimaiDoctorGroupMoreTopicCommonCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
cell.type = [NSString stringWithFormat:@"%ld",indexPath.item + ];
FLOG(@"cell ======== %@", cell);
return cell;
}else{
identifier = @"YimaiDoctorGroupMoreTopicMyCollectionCell";
YimaiDoctorGroupMoreTopicMyCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
cell.type = (int)indexPath.item + ;
return cell;
}
}
+ (instancetype)collectionViewWithObject:(id)object
{
//流水布局
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
CGFloat itemHeight = kScreenH - kCollectionviewHeight - kNavigtaionHeight;
layout.itemSize = CGSizeMake(kScreenW, itemHeight);
layout.minimumLineSpacing = ;
layout.minimumInteritemSpacing = ; //初始化
YimaiDoctorGroupMoreTopicCollectionView *collection = [[YimaiDoctorGroupMoreTopicCollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
//注册
//解决ios9下 自定义的一个UICollectionViewCell只走一次awakeFromNib
for (int i = ; i < ; i++) {
[collection registerNib:[UINib nibWithNibName:kCommonIdentifier bundle:nil] forCellWithReuseIdentifier:[NSString stringWithFormat:@"%@-%d", @"YimaiDoctorGroupMoreTopicCommonCollectionCell", i]];
}
// [collection registerNib:[UINib nibWithNibName:kCommonIdentifier bundle:nil] forCellWithReuseIdentifier:kCommonIdentifier];
[collection registerNib:[UINib nibWithNibName:kMyIdentifier bundle:nil] forCellWithReuseIdentifier:kMyIdentifier];
//分页
collection.pagingEnabled = YES;
//数据源,代理
collection.delegate = object;
collection.dataSource = object;
//
collection.backgroundColor = [UIColor clearColor];
return collection;
}
iOS9下UICollectionViewCell的awakeFromNib问题的更多相关文章
- iOS适配 旧项目工程在iOS9下不能正常显示
在iOS开发中,很多时候会用到旧项目,比如版本的升级.使用Demo等等, iOS SDK正在不断的升级,不断的升级给iOS开发带来了新的活力. 然而在iOS SDK新的版本出来之后,旧项目可能会出现新 ...
- iOS9下的Map Kit View下的使用
最近有个任务是关于地理位置上的标注开发,经过一些资料的查找和对比,现总结一些经验,给读者也是给自己. iOS9下的Map Kit View实际是以前MapKit,只不过换了一个名字,实际是指同一个UI ...
- iOS9下修改回HTTP模式进行网络请求
升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...
- iOS iOS9下修改回HTTP模式进行网络请求
升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...
- 解决IOS9 下在App中无法打开其他应用的问题
打开 info.plist 文件 ,在根节点下添加下面代码即可,这是由于IOS9新的权限管理机制的问题 <key>LSApplicationQueriesSchemes</key&g ...
- iOS 检测有没有安装其它应用 和ios9下要注意的地方
UIApplication *app = [UIApplication sharedApplication]; NSURL *url = [NSURL URLWithString:@"Tri ...
- ios9下ionic框架报[$rootScope:infdig] 10 $digest() iterations reached. Aborting!的解决办法
升级ios9后,ionic开发的app会报[$rootScope:infdig] 10 $digest() iterations reached. Aborting!的错误,加上一个patch就可以解 ...
- xcode7和ios9下UIWebView不能加载网页的解决方法
错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecu ...
- 解决iOS9下隐藏App返回按钮文字导致的诡异闪屏问题
问题的原因竟是一行代码导致的,这行代码的作用是隐藏App返回按钮的文字. 看看这有问题的代码: //将返回按钮的文字position设置不在屏幕上显示 [[UIBarButtonItem appear ...
随机推荐
- Implement Trie (Prefix Tree)实现字典树
[抄题]: Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inp ...
- 4-memset函数总结
头文件:cstring 或 memory 一般用处: memset(arr, 0, sizeof(aar)); //初始化为0 memset(arr, -1, sizeof(aar)); / ...
- Sprint boot notes
1. spring.io 官网 2. http://javainuse.com/spring/sprboot spring boot学习资源 3. spring boot websocketss视频 ...
- Android内核的编译与测试
1.下载Android内核 source.android.com/source->Downloading and Building Building Kernels 大概要花2个小时,其源码在培 ...
- java如何集成支付宝移动快捷支付功能
项目需要,需要在客户端集成支付宝接口.第一次集成,过程还是挺简单的,不过由于支付宝官方文档写的不够清晰,也是走了一些弯路,下面把过程写出来分享给大家.就研究了一下:因为使用支付宝接口,就需要到支付宝官 ...
- 马婕 2014MBA专硕考试 报刊选读 6(转)
http://blog.sina.com.cn/s/blog_3e66af4601016udh.html Protecting the weakest保护最弱势群体The recession may ...
- Redis持久化(八)
Redis特性: (1)多数据库 (2)Redis事物 (3)一个Redis最多可提供16个数据库,下标[0-15] 选择数据库: select 1 (选择1号数据库,默认连接的是0号数据库)移动数据 ...
- linux 查找php.ini在那个文件夹
第一种方法:通过phpinfo查看 第二种方法: 执行 php -i | grep php.ini 结果如下:
- dojo和jquery混合使用
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/dojo/1.7 ...
- 20169205实验四 Android程序设计
20169205实验四 Android程序设计 实验内容及步骤 (一)第一个android studio项目 android studio与eclipse的传统安卓开发有一些不同之处 android ...