iOS开发学习之导航控制器和应用程序的生命周期

(一) 导航控制器 


利用导航控制器UINavigationController可以实现多个控制器的切换

典型的例子就是iPhone上"设置”应用


下面虾米写一个小demo代码来实现的多控制器的切换。

使用UINavigationController的使用步骤:

<1.初始化UINavigationController

<2.设置UIWindow的rootViewController为UINavigationController

<3.根据具体情况 通过push方法添加对应个数的子控制器

#import "JHAppDelegate.h"
#import "JHOneViewController.h"

@implementation JHAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    // 1.创建导航控制器
    UINavigationController *nav = [[UINavigationController alloc] init];
    
    // 2.设置window的根控制器
    self.window.rootViewController = nav;
    
    // 3.添加子控制器到导航控制器中
    JHOneViewController *oneVc = [[JHOneViewController alloc] init];
    // 3.1添加子控制器到导航控制器中
    [nav pushViewController:oneVc animated:YES];
    
    [self.window makeKeyAndVisible];
    return YES;
}

从上面一段代码中 控制器的创建又可以分为3种:

1.通过storyboard创建

2.通过指定xib文件创建

3.通过直接创建

而虾米就用指定xib来创建三个控制器。

显示在window上的控制器的view如下:




通过点击第一个控制器按钮“press” 切换到第二个控制器

具体实现代码如下:

#import "JHOneViewController.h"
#import "JHTwoViewController.h"

@interface JHOneViewController ()

- (IBAction)oneJump2Two;

@end

@implementation JHOneViewController


-(void)viewDidLoad
{
    // 1.设置导航条显示的内容
    self.navigationItem.title = @"第一个控制器";
    // 2.修改返回的按钮的内容
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
}

- (IBAction)oneJump2Two {
    // 1.创建控制器
    JHTwoViewController *twoVc = [[JHTwoViewController alloc] init];
  
    // 2.将第二个控制器添加到导航控制器中
    // 只要当前的控制器是导航控制器的子控制器 就能通过该属性获得当前控制器的导航控制器了
    [self.navigationController pushViewController:twoVc animated:YES];
}
@end



最后动画的效果push到第二个控制器 如图:




所有实现多个控制器的话  同理可得到第3,5,6.....多个控制器。

那么有些人就问  要返回的话就就只能点系统自带的返回吗  这个不一定。通过上面我们可以知道一个原理,其实UINavigationCotroller是以“栈”的形式管理控制器  先进后出的。下面我通过在第三个控制器添加按钮 来实现返回到上一个控制器。

#import "JHThreeViewController.h"

@interface JHThreeViewController ()

- (IBAction)jump2lastVc;


@end

@implementation JHThreeViewController

-(void)viewDidLoad
{
    // 设置导航条的显示内容
    self.navigationItem.title = @"第三个控制器";
}
- (IBAction)jump2lastVc {
    // 移除栈顶的控制器
    [self.navigationController popViewControllerAnimated:YES];
}
@end



(二) 应用程序的生命周期


在程序刚开始启动的时候,main函数是最先进入执行的。

而在main函数里面执行着一个无限循环的代码,并有一个事件处理源和一个定时源。说到NSRunLoop就在此打住吧。

程序启动,得判断程序有没有storyboard。

有storyboard的情况

   > main函数

   > UIApplicationMain函数

    创建一个UIApplication对象并遵守UIApplicationDelegate代理协议

  > 根据info.plist获得storyboard文件名,并加载其storyboard.


没有storyboard的情况

   > main函数

   > UIApplicationMain函数

      创建一个UIApplication对象并遵守UIApplicationDelegate代理协议

  > 代理对象会处理系统事件。当程序完全启动完毕时 就会调用代理的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法,我们必须在里面创建和设置window和根控制器  并让其显示出来。

以上是界面程序显示的情况。

而代理对象处理系统事件 有这么几个方法:

// app发生了中断(中途打电话进来)

- (void)applicationWillResignActive:(UIApplication *)application


// app从前台进入后台

 - (void)applicationDidEnterBackground:(UIApplication *)application


// app从后台进入前台

- (void)applicationWillEnterForeground:(UIApplication *)application


// app已经切换到active状态后需要执行的操作

- (void)applicationDidBecomeActive:(UIApplication *)application


// app将来结束时将来执行的操作

- (void)applicationWillTerminate:(UIApplication *)application


// app发生内存警告 此时得清理一些占用内存的数据

-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application



在这里有必要说下有关于内存警告。从创建控制器到控制器销毁。当application发生内存警告的时候,会通知代理 调用applicationDidReceiveMemoryWarning:这个方法

,代理会通知UIWindow,UIWindow会通知根控制器,根控制器会通知子控制器,子控制器会调用内部的viewWillUnload方法 从而销毁view 。 可以说是一层一层往里通知。销毁的了view之后,销毁view中不过为了安全性着想,还是存在一些额外数据的。我们一般在viewDidUnLoad中实现,应该销毁其存在的数据 将数据写为nil;

不然会发生一些莫名其妙的bug。

  




总结 上面所讲的内容。iOS应用程序从启动到结束的过程当中有哪些关键的对象在参与到其中,以及当用户与系统交互时产生的事件时,系统利用main run loop来管理事件循环。决定将事件交给系统哪些对象处理以及如何处理。而当app启动,或app来回的切换,描述了app的状态变化。


如果有什么需要补充或者是有说不对的地方,请大牛指教,再次谢谢^-^

可以加虾米的联系啊方式:

QQ:584837022

微信:foreverlovewillgoon


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值