(一) 导航控制器
利用导航控制器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