·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> IOS学习笔记----15/09/01

IOS学习笔记----15/09/01

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

1.创建控制器的三种方式:

  1. 单纯的alloc init
    1 MyViewController *myvc = [[MyViewController alloc] init];
    2 self.window.rootViewController = myvc;
  2. 加载storyboard的方式
    1 MyStoryboard *storyboard = [MyStoryboard storyboardWithName:@"myBoard" bundle:nil];
    2 MyViewController *myvc = [storyboard instantiateViewControllerWithIdentifier:@"myController"];
    3 self.window.rootViewController = myvc;
  3. 加载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,加载的过程大致为以下几步:

  1.  先将self.window alloc并且initWithFrame或者init然后给frame属性赋值;
  2. 声明一个新的UIStoryboard对象并且指向[UIStoryboard storyboardWithName:@"Main" bundle:nil];
  3. 给window的根控制器rootViewController赋值[storyboard instantiateInitialViewController];
  4. 使用[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添加子控件:

  1. 调用pushViewController方法;
  2. 调用addChildViewController方法;
  3. 给viewControllers赋予新数组并在其中添加ViewController;
  4. 在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.观察控制器生命周期的方法:

  1. viewDidLoad:窗口加载完毕。
  2. ViewWillAppear:窗口即将显示到window上。
  3. viewDidAppear:窗口已经显示到window上。
  4. viewWillDisappear:窗口即将从window上移除。
  5. viewDidDisappear:窗口已经从window上移除。
  6. viewWillUnload:内存即将销毁的时候。
  7. viewDidUnload:内存销毁完毕的时候。
  8. didReciveMemoryWarning:接收到内存警告的时候。
    // MyController1 viewDidLoad
    // MyController1 viewWillAppear
    // MyController1 viewDidAppear
    // MyController2 viewDidLoad
    // MyController1 viewWillDisAppear
    // MyController2 viewWillAppear
    // MyController1 viewDidDisAppear
    // Mycontroller2 viewDidAppear
    生命周期部分打印结果

     

16.生命周期参考图:

17.内存警告处理参考图:

 

 


刚开始写没几天,只是对我每天所学知识的一个记录,写的很乱,如果有错还望指正。

/!-- 灰色表示以后研究。--/