zoukankan      html  css  js  c++  java
  • iOS开发UI篇—使用storyboard创建导航控制器以及控制器的生命周期

    一、基本过程

    新建一个项目,系统默认的主控制器继承自UIViewController,把主控制器两个文件删掉。

    在storyboard中,默认的控制器是View Controller,而我们需要的是导航控制器,那么就把系统的给删掉,拖一个导航控制器进来,导航控制器中默认的第一个子控制器是一个tableview controller,这里不需要,把它删掉,重新拖三个View Controller到界面上进行连线,简单的设置就可以了。

              

    按钮连线,按住ctrl,右边界面选择push。

      

    完成基本设置后的界面如下:

    经过这么几步简单的设置,就可以实现一个简单的多页面切换。为开发提供了极大的方便,但storyboard也不是万能的,要注意在开发中,如果在最后一个页面添加一个按钮,让它直接跳转到上一个页面会出现问题。

    提示:storyboard能做的事情,使用代码都能做,但是代码能够做的事情,storyboard不一定能够做。

    通过拖拉控件即可完成简单的界面设置。

    下面这样的连线会出现问题:(从后面的控制器跳转到前面,只能通过代码来实现)

    产生问题的原因:(当点击返回的时候,不是先把第三个控制器移除栈顶,而是先创建TWO控制器,此时栈里有四个控制器,栈顶的为TWO).

    二、控制器的生命周期

    代码简单说明:

     1 @interface NJOneViewController ()
     2 
     3 @property (nonatomic, strong) NSArray *foods;
     4 @end
     5 
     6 @implementation NJOneViewController
     7 
     8 // 当控制器的view加载完毕就调用
     9 - (void)viewDidLoad
    10 {
    11     [super viewDidLoad];
    12     NSLog(@"1控制器的view加载完毕");
    13 }
    14 
    15 // 控制器的view即将显示的时候调用
    16 - (void)viewWillAppear:(BOOL)animated
    17 {
    18     [super viewWillAppear:YES];
    19     NSLog(@"1控制器的view即将显示");
    20 }
    21 
    22 // 控制器的view完全显示的时候调用
    23 - (void)viewDidAppear:(BOOL)animated
    24 {
    25     [super viewDidAppear:animated];
    26     NSLog(@"1控制器的view完全显示");
    27 }
    28 
    29 // 控制器的view即将消失的时候调用
    30 - (void)viewWillDisappear:(BOOL)animated
    31 {
    32     [super viewWillDisappear:animated];
    33     NSLog(@"1控制器的view即将消失");
    34 }
    35 // 控制器的view完全消失的时候调用
    36 - (void)viewDidDisappear:(BOOL)animated
    37 {
    38     [super viewDidDisappear:animated];
    39     NSLog(@"1控制器的view完全消失");
    40 }
    41 
    42 // 控制器的view即将销毁的时候调用
    43 - (void)viewWillUnload
    44 {
    45     [super viewWillUnload];
    46 }
    47 // 控制器的view完全销毁的时候调用
    48 - (void)viewDidUnload
    49 {
    50     [super viewDidUnload];
    51     // 清空不需要的属性
    52 //    [self.foods release];
    53     self.foods = nil;
    54 }
    55 
    56 //- (void)setFoods:(NSArray *)foods
    57 //{
    58 //    if (_foods != foods) {
    59 //        [foods release];
    60 //        _foods = [foods retain];
    61 //    }
    62 //}
    63 
    64 // 接收到内存警告的时候调用
    65 - (void)didReceiveMemoryWarning
    66 {
    67     [super didReceiveMemoryWarning];
    68 }
    69  /**/
    70 
    71 @end

    打印结果如下

    三个重要的方法:

     1 // 控制器的view即将销毁的时候调用
     2 - (void)viewWillUnload
     3 {
     4     [super viewWillUnload];
     5 }
     6 // 控制器的view完全销毁的时候调用
     7 - (void)viewDidUnload
     8 {
     9     [super viewDidUnload];
    10     // 清空不需要的属性
    11 //    [self.foods release];
    12     self.foods = nil;
    13 }
    14 
    15 // 接收到内存警告的时候调用
    16 - (void)didReceiveMemoryWarning
    17 {
    18     [super didReceiveMemoryWarning];
    19 }

    补充:

    两个内存警告的区别(和代理中得比较):

    代理的内存警告:当application发生一些事情的时候(接收到内存警告的时候),会先通知它的代理,之后代理会通知它的window,window会通知它的根控制器,根控制器会通知它的子控制器。内存警告是由上往下一层一层往下传的(可以通过在两个地方打印输出验证)。

    需要了解它的父类是如何处理内存警告的。

    模拟内存警告:

    内存警告的处理示意图:

    控制器的view是否可以销毁?它怎么知道是否可以销毁呢?如何判断?它是判断这个view是否是在windows上面。

    当前one控制器在栈顶,one控制器对应的view显示在window上,如果此时发生内存警告,那么one因为在window上面,所以不会被销毁。

    若此时再来一个two控制器,它创建对应的twoview显示到window上,one对应的view移开了,此时如果发生内存警告,则此时oneview已经不再在window上显示,所以会被销毁。

    特别说明:outlet代表着属性,当控制器创建的时候,属性一般也是有值的,当调用了- (void)viewDidUnload方法以后,即控制器的view完全销毁了以后,所有的属性数据会清空。一般在ios5以前,还会在这个方法里面清空里面的所有属性。

    提示:所有的控制器的这些方法其实是一个循环。

  • 相关阅读:
    OK335x mksd.sh hacking
    Qt jsoncpp 对象拷贝、删除、函数调用 demo
    OK335xS 256M 512M nand flash make ubifs hacking
    Qt QScrollArea and layout in code
    JsonCpp Documentation
    Qt 4.8.5 jsoncpp lib
    Oracle数据库生成UUID
    freemarker得到数组的长度
    FreeMarker中if标签内的判断条件
    freemarker语法
  • 原文地址:https://www.cnblogs.com/zengshuilin/p/5754645.html
Copyright © 2011-2022 走看看