最近项目测试出一个隐藏已久的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问题的更多相关文章

  1. iOS适配 旧项目工程在iOS9下不能正常显示

    在iOS开发中,很多时候会用到旧项目,比如版本的升级.使用Demo等等, iOS SDK正在不断的升级,不断的升级给iOS开发带来了新的活力. 然而在iOS SDK新的版本出来之后,旧项目可能会出现新 ...

  2. iOS9下的Map Kit View下的使用

    最近有个任务是关于地理位置上的标注开发,经过一些资料的查找和对比,现总结一些经验,给读者也是给自己. iOS9下的Map Kit View实际是以前MapKit,只不过换了一个名字,实际是指同一个UI ...

  3. iOS9下修改回HTTP模式进行网络请求

    升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...

  4. iOS iOS9下修改回HTTP模式进行网络请求

    升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...

  5. 解决IOS9 下在App中无法打开其他应用的问题

    打开 info.plist 文件 ,在根节点下添加下面代码即可,这是由于IOS9新的权限管理机制的问题 <key>LSApplicationQueriesSchemes</key&g ...

  6. iOS 检测有没有安装其它应用 和ios9下要注意的地方

    UIApplication *app = [UIApplication sharedApplication]; NSURL *url = [NSURL URLWithString:@"Tri ...

  7. ios9下ionic框架报[$rootScope:infdig] 10 $digest() iterations reached. Aborting!的解决办法

    升级ios9后,ionic开发的app会报[$rootScope:infdig] 10 $digest() iterations reached. Aborting!的错误,加上一个patch就可以解 ...

  8. xcode7和ios9下UIWebView不能加载网页的解决方法

    错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecu ...

  9. 解决iOS9下隐藏App返回按钮文字导致的诡异闪屏问题

    问题的原因竟是一行代码导致的,这行代码的作用是隐藏App返回按钮的文字. 看看这有问题的代码: //将返回按钮的文字position设置不在屏幕上显示 [[UIBarButtonItem appear ...

随机推荐

  1. 网页截图API接口,一键自动生成网页截图

    背景 最近在开发一个小程序,其中有一个帮助模块,内容为帮助文章列表,文章内容为网站后台编辑的富文本格式.鉴于小程序的特殊性,其对html格式的富文本支持并不友好. 刚开始有人开发了wxparse插件, ...

  2. (转)Java 中关于String的空对象(null) ,空值(empty),空格

    原文出处:Java 中关于String的空对象(null) ,空值(empty),空格 定义 空对象: String s = null; 空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例 ...

  3. vue elementui form表单验证

    最近我们公司将前端框架由easyui 改为 vue+elementui .自学vue两周 就开始了爬坑之路.业余时间给大家分享一下心得,技术新手加上第一次分享(小激动),有什么不足的地方欢迎大家指正, ...

  4. using namespace cv

    在OpenCV中使用 using namespace cv 的作用: 在使用#include语句包含相应头文件后,使用下面语句即可包含相应的Opencv命名空间 using namespace cv; ...

  5. msdn 硬盘

    https://msdn.microsoft.com/library/windows/hardware/ff566204 Returns the ATA-2 identify data, the Se ...

  6. Apache 调用不同的 PHP 版本

    # cd /etc/apache2/mods-enabled 建立 /etc/apache2/mods-available/ 之下的 php7.2.load   php7.2.conf 两个文件的符号 ...

  7. asp.net hessian + android hessdroid

    做android开发时你还在为gson,json而人肉序列化与反序列化吗,上传文件时你还在使用UrlConnection或者HttpClient吗?下面提供了asp.net 服务端与 android ...

  8. 无线破解那点事(PJ)

    有一段时间没有写博客了.只能说苦逼学生党伤不起啊,还好没挂-废话不说了,近期将会讲讲无线PJ那点事,也不是啥干货,就一些先前的笔记分享把. 0.无线网卡 想要提高破解效率,一块猛一点的USB无线网卡是 ...

  9. Lucene--FuzzyQuery与WildCardQuery(通配符)

    FuzzyQuery: 创建索引: IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(), false); writer. ...

  10. ie11 兼容的问题

    碰到一个问题 下拉列表点不了. 测试后,只在ie11下有这个问题. 先是在head 加<meta http-equiv=”X-UA-Compatible” content="IE=8& ...