zoukankan      html  css  js  c++  java
  • 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 = 0;
        layout.minimumInteritemSpacing = 0;
        
        
        //初始化
        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 4;
    }
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *identifier;
        if (indexPath.item < 3) {
            identifier = @"YimaiDoctorGroupMoreTopicCommonCollectionCell";
            YimaiDoctorGroupMoreTopicCommonCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
            cell.type = [NSString stringWithFormat:@"%ld",indexPath.item + 1];
            FLOG(@"cell ======== %@", cell);
            return cell;
        }else{
            identifier = @"YimaiDoctorGroupMoreTopicMyCollectionCell";
            YimaiDoctorGroupMoreTopicMyCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
            cell.type = (int)indexPath.item + 1;
            return cell;
        }
    }

    每个自定义的UICollectionViewCell里面添加了UITableView作为子控件,并且能上拉加载,下拉刷新,所以有一些初始化

    #pragma mark - life cycle
    - (void)awakeFromNib {
        [super awakeFromNib];
        //设置tableview
        [self setTableViewAttributes];
        self.page = 1;
    }

    当前控制器里顶部还加了资格按钮,用来点击可以实现UICollectionView的滑动

    上面是核心源码,看似很正确的实现,最后却验证在iOS9下“不能滑动”,即看似下面这句话不执行

    [self.collectionView setContentOffset:CGPointMake(index * kScreenW, 0) animated:NO];

    最后通过各种系统版本机型的调试,验证了,上面的这句setContentOffset没有问题,有问题的是,iOS9上YimaiDoctorGroupMoreTopicCommonCollectionCell的awakeFromNib方法只执行了一次,而在其他的手机版本下走了三次,所以导致当初注册的两种类型的cell,这里三种看似相同的cell现在都是完全一样了,数据都一样。类似于是用的同一个地址,而不是我们认为的,三种长得一样的cell都拥有自己独立的地址,所以才导致看着是没滑动,具体为什么还在不同的系统版本上有这种情况,查了资料也没什么头绪,有了解的伙伴们还请多多指点!!最后只附上解决方法:三种看似相同的cell不复用了,于是有了下面重用标识符的修改

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *identifier;
        if (indexPath.item < 3) {
            identifier = [NSString stringWithFormat:@"%@-%ld",@"YimaiDoctorGroupMoreTopicCommonCollectionCell", indexPath.item];
            YimaiDoctorGroupMoreTopicCommonCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
            cell.type = [NSString stringWithFormat:@"%ld",indexPath.item + 1];
            FLOG(@"cell ======== %@", cell);
            return cell;
        }else{
            identifier = @"YimaiDoctorGroupMoreTopicMyCollectionCell";
            YimaiDoctorGroupMoreTopicMyCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
            cell.type = (int)indexPath.item + 1;
            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 = 0;
        layout.minimumInteritemSpacing = 0;
        
        
        //初始化
        YimaiDoctorGroupMoreTopicCollectionView *collection = [[YimaiDoctorGroupMoreTopicCollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
        //注册
        //解决ios9下 自定义的一个UICollectionViewCell只走一次awakeFromNib
        for (int i = 0; i < 3; 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;
    }
  • 相关阅读:
    Directx11教程(63) tessellation学习(5)
    OpenCL 学习step by step (1) 安装AMD OpenCL APP
    Directx11教程(62) tessellation学习(4)
    Directx11教程(61) tessellation学习(3)
    Notes 和 Domino 已知限制
    asp.net中的WebApplication和WebSite
    平淡的2007
    TinyMCE与Domino集成
    jOOQ 2.6.0 发布,Java的ORM框架
    bandwidth 0.32f 发布,内存带宽测试工具
  • 原文地址:https://www.cnblogs.com/jingxin1992/p/9013298.html
Copyright © 2011-2022 走看看