- 首先干掉這三個文件
Snip20160512_8.png
- 創(chuàng)建CollectionViewController
- 以及在項目中如下設(shè)置一下:
Snip20160512_9.png
Snip20160512_10.png
- 也就是清空Main Interface即可
- 在Appdelegate.m中給window設(shè)置根控制器
#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.此處設(shè)置window的背景色為白色
2.如果有多個控制器的話,不用一一給每個控制器設(shè)置背景色.
3.此行代碼在此并不管用.原因是collectionVIew把window給糊住了看下圖 以及解釋
*/
self.window.backgroundColor = [UIColor whiteColor];
/** 設(shè)置window的根控制器 */
PBViewController * rootVc = [[PBViewController alloc] init];
self.window.rootViewController = rootVc;
[self.window makeKeyAndVisible];
return YES;
}
- 如果這樣就可以了,就太簡單啦...然后點擊運行報錯-01
Snip20160512_11.png
- 調(diào)試技巧之一:就是看調(diào)用堆棧,看不懂的方法不用看,那是系統(tǒng)自動調(diào)用的系統(tǒng)方法,[NSException raise]....這里是拋出異常的意思.看他的下一個方法是調(diào)用的誰拋出的異常---[UICollectionView initWithFrame:collectionViewLayout:] 調(diào)用這個方法而拋出的異常.也就是說,collectionView初始化的時候崩潰的.再看上面的reason: 大概意思就是沒給collectionVIew初始化一個布局參數(shù)layout
- 錯誤已經(jīng)了解.那就從根本入手-給collectionView設(shè)置布局參數(shù).
- 多提一嘴:解決方式一: 可以直接在Appdelegate中創(chuàng)建一個collectionView然后創(chuàng)建一個布局參數(shù),并設(shè)置給collectionView.不過不建議這樣干...因為"自己的事情自己干"把初始化collectionView以及布局參數(shù)在CollectionViewController中設(shè)置最好
- 并且初始化要在init里面.
/** 控制器初始化的同時設(shè)置布局參數(shù)給collectionView */
-(instancetype)init{
/** 創(chuàng)建布局參數(shù) */
UICollectionViewFlowLayout * flowLayout = [[UICollectionViewFlowLayout alloc] init];
flowLayout.itemSize = CGSizeMake(30, 40);
/**
1.創(chuàng)建collectionView
2.設(shè)置布局參數(shù)
*/
self.collectionView = [[UICollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds collectionViewLayout:flowLayout];
/** 注冊cell可重用ID */
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
/**
1.設(shè)置背景色
2.由于糊上了一層collectionView所以在Appdelegate中設(shè)置window的背景色被collectionView覆蓋.此時collectionView的顏色要重新設(shè)置
*/
self.collectionView.backgroundColor = [UIColor whiteColor];
return self;
}
- 層級視圖關(guān)系:
Snip20160512_12.png
- 最下面一層是UIWindow
Snip20160512_13.png
- 中間這一層是:UICollectionViewControllerWapperView: 包含collectionViewController的一個層級視圖
Snip20160512_14.png
- 最下面一層是:uicollectionView,由于沒有設(shè)置背景色,默認是黑色,所以當(dāng)初如果在Appdelegate中設(shè)置了window的背景色為白色,在這里還會蓋住.要重新設(shè)置collectionView的背景色
/**
1.后于init方法調(diào)用
2.可以在此注冊cell可重用ID.
3.建議在init里面創(chuàng)建或者初始化一些視圖控件之類操作
*/
-(void)viewWillAppear:(BOOL)animated{
NSLog(@"%s",__func__);
}
- 在init的方法里面注冊可重用ID,因為此時Viewdidload方法已經(jīng)不再執(zhí)行...具體原因 還不清楚.(有知道的小伙伴,私信發(fā)給我0.0)
/** 方法不會被調(diào)用,所以注冊cell的方法要寫在init中 */
- (void)viewDidLoad {
[super viewDidLoad];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
}
- 此時運行沒有問題.
注意點: