1.创建控制器的三种方式:
- 单纯的alloc init
1 MyViewController *myvc = [[MyViewController alloc] init]; 2 self.window.rootViewController = myvc;
- 加载storyboard的方式
1 MyStoryboard *storyboard = [MyStoryboard storyboardWithName:@"myBoard" bundle:nil]; 2 MyViewController *myvc = [storyboard instantiateViewControllerWithIdentifier:@"myController"]; 3 self.window.rootViewController = myvc;
- 加载xib的方式(该方法在创建完成后需要在xib界面将File's Owner设置成MyViewController类并且右键拖线将View设置为想显示的View窗口)
1 MyViewController *myvc = [[MyViewController alloc] initWithNibName:@"MyNib" bundle:nil]; 2 self.window.rootViewController = myvc;
2.程序启动时会去寻找Main Interface,如果找到Main Interface则会自动加载默认的storyboard,加载的过程大致为以下几步:
- 先将self.window alloc并且initWithFrame或者init然后给frame属性赋值;
- 声明一个新的UIStoryboard对象并且指向[UIStoryboard storyboardWithName:@"Main" bundle:nil];
- 给window的根控制器rootViewController赋值[storyboard instantiateInitialViewController];
- 使用[self.window makeKeyAndVisible]显示window;
3.storyboard加载后使用instantiateViewControllerWithIdentifier:@"storyboardId"方法也可以获得storyboard的ViewController对象。
4.同样可以使用alloc init创建控制器对象然后设置为根控制器的方式来显示页面,但是添加控件就必须使用代码了。
5.storyboard需要主动加载,即使storyboard设置为MyViewController,如果通过alloc init创建ViewController而不是通过加载storyboard,那么storyboard(包括其中的控件)不会自动进行加载。
6.下图为参考,如果MyViewController实现了loadView方法,则会执行loadView中的方法而不去加载storyboard或者xib文件(在加载文件之前),如果没有实现,再去寻找storyboard或者与nibName对应的xib,找不到nibName的时候会先去找与控制器类名去除Controller后相同文件名的xib文件,如果还未找到则找与控制器类名完全相同的xib文件。
7.在调用[self.window makeKeyAndVisible]方法的时候会因为要显示window,然后会调用window的根控制器,然后调用根控制器的view,因为是懒加载,如果之前设置了myvc.view的某些属性,则当时就会立即去绘制view,成功绘制出View后会调用viewDidLoad方法(此过程中只会调用一次)。另一张图可能会更加清楚些,不过下图忽略了xib。
8.通过使用UINavigationController的pushViewController方法可以做到界面的跳转,最后push进去的则最先显示。(用栈来说的话,就是出栈,销毁栈顶的控制器以及View,显示新栈顶的View)
9.四种方法实现给NavigationContoller添加子控件:
- 调用pushViewController方法;
- 调用addChildViewController方法;
- 给viewControllers赋予新数组并在其中添加ViewController;
- 在alloc后不使用init而是使用initWithRootViewController方法;
10.进栈与出栈的方法

1 // 使用push方法能让某个控制器进栈 2 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 3 4 // 使用pop方法可以出栈 5 6 // 将栈顶的控制器移除 7 - (UIViewController *)popViewControllerAnimated:(BOOL)animated; 8 9 // 回到指定的子控制器 10 - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; 11 12 // 回到根控制器(栈底控制器) 13 - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
11.栈顶ViewController的navigationBar返回按钮是由次栈顶的ViewController中的backBarButtonItem决定的。只要对次栈顶的BackBarButtonItem进行赋值UIBarButtonItem就可以修改返回键的标题。
12.控制器的View默认是占满整个屏幕的。
13.通过拖线设置navigationController的rootViewController属性可以设置根控制器。
14.storyboard直接拖NavigationCotroller,然后通过拖线连接的方式连接ViewController,segue选择push。(在IOS7的时候还是能选择push,但是在ios8的时候,xcode6.1.1版本上push已经变成了不建议使用,有新的名为show的方法可以替代,起到同样效果,暂时不知道有什么优点)
15.观察控制器生命周期的方法:
- viewDidLoad:窗口加载完毕。
- ViewWillAppear:窗口即将显示到window上。
- viewDidAppear:窗口已经显示到window上。
- viewWillDisappear:窗口即将从window上移除。
- viewDidDisappear:窗口已经从window上移除。
- viewWillUnload:内存即将销毁的时候。
- viewDidUnload:内存销毁完毕的时候。
- didReciveMemoryWarning:接收到内存警告的时候。
// MyController1 viewDidLoad // MyController1 viewWillAppear // MyController1 viewDidAppear // MyController2 viewDidLoad // MyController1 viewWillDisAppear // MyController2 viewWillAppear // MyController1 viewDidDisAppear // Mycontroller2 viewDidAppear
16.生命周期参考图:
17.内存警告处理参考图:
刚开始写没几天,只是对我每天所学知识的一个记录,写的很乱,如果有错还望指正。
/!-- 灰色表示以后研究。--/