-
项目基本架构图
程序启动时,手动加载UIWindow
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 1.先创建window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor yellowColor];
// 2.加载控制器
// 2.1通过xib添加,加载顺序 view -> viewController.xib -> 默认创建一个几乎透明的view;
UIViewController *vc1 = [[UIViewController alloc] init];
// 指定加载xib
UIViewController *vc2 = [[UIViewController alloc] initWithNibName:@"xib的名字" bundle:nil];
// 2.2通过storyBoard添加。
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
// 2.2.1 storyBoard加载Identifier的标记的控制器。
[storyBoard instantiateViewControllerWithIdentifier:@"Identifier"];
// 2.2.2 storyBoard默认加载箭头指向的控制器。
UIViewController *vc = [storyBoard instantiateInitialViewController];
// 3. 设置UIWindow的根控制器
self.window.rootViewController = vc;
// 4. 将UIWindow显示出来
[self.window makeKeyAndVisible];
return YES;
}
-
控制器的3种创建方式
方法一 alloc init 方法
UIViewController *vc1 = [[UIViewController alloc]init];
方法二 storyboard
第一步:
新建storyboard和操作: 创建新的storyboard(新建文件 user interface 中的 storyBoard) 在新建的storyboard中添加控制器(storyboard就是为了添加控制器的) 给stoBoard设置入口初始化控制器 箭头指向 : Is Initial View Controller
第二步:
获取storyboard文件对象:(此处类似加载xib文件)
// bundle在尾,可以为nil,这里取storyboard文件只是为了根据文件找控制器
UIStoryboard *board = [UIStoryboard storyboardWithName:@"ViewControllerOne" bundle:nil];
// 初始化storyboard中的控制器 : 根据控制器的标识
UIViewController *rootVc = [board instantiateViewControllerWithIdentifier:@"tuhuangse"]
方法三 xib : xib的本质就是一个View,原则上不能拖控制器,但实际上能直接拖控制器,但是控制器不能用
第一部分: 创建UIViewController类文件
第二部分: 新建xib和操作 : 新建xib ,拖入控件 , fileowner(在导航区)绑定Controller类文件,再连线View
第三部分: 在appdelegate的程序启动完成方法中,根据fileowner绑定的Controller文件创建控制器(用loadnib的方法,确定要加载的View)
创建xib的时候用empty,不然容易冲突
注意:当出现xib文件名与控制器名相同(为不加Controller的名,或者完全同名)时,加载xib可以不填写文件名:直接alloc init,此时加载xib的优先级,完全同名的优先级比较高.
初始化控制器的时候:
调用init方法,底层调用了initWithFrame方法
storyBoard或者xib加载的调用initWithCoder方法,解析文件;
控制器中的View是懒加载的 : (根据懒加载的特点:用到的时候才会创建来证明)
证明步骤 : 手动创建根窗口,在进行到将窗口设置为主窗口的方法前,都不会进入ViewdidLoad方法 / 但是如果在设置主窗口之前就设置控制器View的背景颜色,那么就会进入ViewdidLoad方法
网友评论