最近项目测试出一个隐藏已久的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. mysql添加表注释、字段注释、查看与修改注释

    1 创建表的时候写注释create table test1( field_name int comment '字段的注释')comment='表的注释'; 2 修改表的注释alter table te ...

  2. Windows c++面向对象与可视化编程的基础知识

    1.Windows的程序设计语言:Visual C++,Visual Basic ,Visual c#都是“面向对象”的程序设计语言; 2.Windows的程序设计的对象:是Windows的规范部件, ...

  3. app开发中如何利用sessionId来实现服务端与客户端保持回话

    app开发中如何利用sessionId来实现服务端与客户端保持回话 这个问题太过于常见,也过于简单,以至于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来常用的方法有以下几种: ...

  4. msfvenom木马生成+免杀+壳(实测并不能免杀)

    msfvenom 选项: -p, --payload 有效载荷使用.指定一个有效的自定义载荷 --payload-options 列出有效载荷的标准选项 -l, --list [type] 列出一个模 ...

  5. 企业搜索引擎开发之连接器connector(十九)

    连接器是基于http协议通过推模式(push)向数据接收服务端推送数据,即xmlfeed格式数据(xml格式),其发送数据接口命名为Pusher Pusher接口定义了与发送数据相关的方法 publi ...

  6. Sqlite 快速插入数据到本地表中

    用原始Insert方法太慢,网上找到了https://www.cnblogs.com/yisen-code/p/6897524.html 思路是: 开启事务,开启预处理,然后把SQL用参数传入具体值来 ...

  7. wp8.1 SQLite的基本使用

    SQLite是一个轻量级的关系型数据库,正是由于其精悍小巧,在移动端平台被广泛应用,但不适合处理大量数据和批量操作.它的底层是由C语言编写,最初设计是为了应用于嵌入式,占用资源非常低且简单易用,而且绝 ...

  8. C#List的创建例程

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. 类文件结构与javap的使用

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.javap的使用与类文件结构 使用过程: java源代码:  1 package compile;   ...

  10. dockerfile构建redis

    -------------------------------------------------------------