ios - 纯代码创建collectionViewControl

作者: AlexPei | 来源:发表于2016-05-12 01:12 被阅读5976次
  • 首先干掉这三个文件
Snip20160512_8.png
  • 创建CollectionViewController
  • 以及在项目中如下设置一下:
Snip20160512_9.png Snip20160512_10.png
  • 也就是清空Main Interface即可
  • 在Appdelegate.m中给window设置根控制器

#import "AppDelegate.h"
#import "PBViewController.h"

#define kScreenW [UIScreen mainScreen].bounds.size.width
#define kScreenH [UIScreen mainScreen].bounds.size.height
#define kScreenB [UIScreen mainScreen].bounds
@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:kScreenB];
    
    /** 
     1.此处设置window的背景色为白色 
     2.如果有多个控制器的话,不用一一给每个控制器设置背景色.
     3.此行代码在此并不管用.原因是collectionVIew把window给糊住了看下图 以及解释
     */
    self.window.backgroundColor = [UIColor whiteColor];
    
    /** 设置window的根控制器 */
    PBViewController * rootVc = [[PBViewController alloc] init];
    self.window.rootViewController = rootVc;
    
    [self.window makeKeyAndVisible];
    return YES;
}

  • 如果这样就可以了,就太简单啦...然后点击运行报错-01
Snip20160512_11.png
  • 调试技巧之一:就是看调用堆栈,看不懂的方法不用看,那是系统自动调用的系统方法,[NSException raise]....这里是抛出异常的意思.看他的下一个方法是调用的谁抛出的异常---[UICollectionView initWithFrame:collectionViewLayout:] 调用这个方法而抛出的异常.也就是说,collectionView初始化的时候崩溃的.再看上面的reason: 大概意思就是没给collectionVIew初始化一个布局参数layout
  • 错误已经了解.那就从根本入手-给collectionView设置布局参数.
  • 多提一嘴:解决方式一: 可以直接在Appdelegate中创建一个collectionView然后创建一个布局参数,并设置给collectionView.不过不建议这样干...因为"自己的事情自己干"把初始化collectionView以及布局参数在CollectionViewController中设置最好
  • 并且初始化要在init里面.

/** 控制器初始化的同时设置布局参数给collectionView */
-(instancetype)init{

    /** 创建布局参数 */
    UICollectionViewFlowLayout * flowLayout = [[UICollectionViewFlowLayout alloc] init];
    flowLayout.itemSize = CGSizeMake(30, 40);
    
    /** 
     1.创建collectionView 
     2.设置布局参数
     */
    self.collectionView = [[UICollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds collectionViewLayout:flowLayout];
    
    /** 注册cell可重用ID */
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
    
    /** 
     1.设置背景色 
     2.由于糊上了一层collectionView所以在Appdelegate中设置window的背景色被collectionView覆盖.此时collectionView的颜色要重新设置
     */
    self.collectionView.backgroundColor = [UIColor whiteColor];
    
    return self;
}

  • 层级视图关系:
Snip20160512_12.png
  • 最下面一层是UIWindow
Snip20160512_13.png
  • 中间这一层是:UICollectionViewControllerWapperView: 包含collectionViewController的一个层级视图
Snip20160512_14.png
  • 最下面一层是:uicollectionView,由于没有设置背景色,默认是黑色,所以当初如果在Appdelegate中设置了window的背景色为白色,在这里还会盖住.要重新设置collectionView的背景色

/**
 1.后于init方法调用
 2.可以在此注册cell可重用ID.
 3.建议在init里面创建或者初始化一些视图控件之类操作
 */
-(void)viewWillAppear:(BOOL)animated{

    NSLog(@"%s",__func__);
}

  • 在init的方法里面注册可重用ID,因为此时Viewdidload方法已经不再执行...具体原因 还不清楚.(有知道的小伙伴,私信发给我0.0)

/** 方法不会被调用,所以注册cell的方法要写在init中 */
- (void)viewDidLoad {
    [super viewDidLoad];

    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
}

  • 此时运行没有问题.

注意点:

1. 创建控制的同时要设置布局参数.
2. self.collectionView也要重新创建.
3. 必须重新注册cell的可重用ID否则崩溃.
4. 调试技巧:看调用堆栈:找抛出异常的方法 [NSException raise]....,在这个方法的前面执行了那个方法,就是抛出异常的根源.再结合reason里面的原因,快速定位错误位置,达到快速解决bug目的.

相关文章

网友评论

    本文标题:ios - 纯代码创建collectionViewControl

    本文链接:https://www.haomeiwen.com/subject/aqgurttx.html