- 创建CollectionViewController
- 以及在项目中如下设置一下:
- 也就是清空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
- 调试技巧之一:就是看调用堆栈,看不懂的方法不用看,那是系统自动调用的系统方法,[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;
}
- 中间这一层是:UICollectionViewControllerWapperView: 包含collectionViewController的一个层级视图
- 最下面一层是: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目的.