【iOS进阶】【多控制器】UINavigationController控制器
一、Xcode6如何创建一个Empty Application模版
1> 运行Xcode 6,创建一个Single View Application工程。
2> 创建好后,把工程目录下的Main.storyboard和LaunchScreen.xib删除

3> 打开Info.plist,把Launch screen interface file base name,以及Main storyboard file base name两项删除
4>打开工程项目属性文件,点击Target下面的第一项,再选择General选项卡,向下找到Use Asset Catalog按钮,点击它。
然后在弹框处点击“Migrate”。
5>最后,在AppDelegate的第一个方法里面,“return”语句之前,添加必要代码。
//OC需要添加的代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//1.创建window;2.设置window背景;3.使window可见。
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
二、多控制器管理的介绍
1> 一个iOS的app很少只由一个控制器组成,除非这个app极其简单,当app中有多个控制器的时候,我们就需要对这些控制器进行管理;
2> 有多个view时,可以用一个大的view去管理1个或者多个小view,控制器也是如此,用1个控制器去管理其他多个控制器;
3> 比如,用一个控制器A去管理3个控制器B、C、D,控制器A被称为控制器B、C、D的“父控制器”,控制器B、C、D的被称为控制器A的“子控制器”;
4> 为了便于管理控制器,iOS提供了2个比较特殊的控制器
1.UINavigationController,利用它,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的“设置”应用;
2.UITabBarController。
三、UINavigationController控制器
1> UINavigationController的使用步骤:
1.初始化UINavigationController
2.设置UIWindow的rootViewController为UINavigationController
3.根据具体情况,通过push方法添加对应个数的子控制器
代码如下:
第一种方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; //1.创建导航控制器 UINavigationController *nav = [[UINavigationController alloc] init]; LYXOneViewController *one = [[LYXOneViewController alloc] init]; //2.添加子控制器 [nav pushViewController:one animated:YES]; //3.把导航控制器设置为窗口的根控制器 self.window.rootViewController = nav; [self.window makeKeyAndVisible]; return YES; }
第二种方法:(初始化的时候设置导航控制器的根子控制器)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; //1.创建子控制器 LYXOneViewController *one = [[LYXOneViewController alloc] init]; //2.创建导航控制器,初始化的时候设置导航控制器的根子控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:one]; //3.把导航控制器设置为窗口的根控制器 self.window.rootViewController = nav; [self.window makeKeyAndVisible]; return YES; }
2> UINavigationController的View结构
3> UINavigationController的子控制器
//UINavigationController以栈的形式保存子控制器 //存放所有子控制器的栈 @property(nonatomic,copy) NSArray *viewControllers; @property(nonatomic,readonly) NSArray *childViewControllers; //使用push方法能将某个控制器压入栈 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; //使用pop方法可以移除控制器 //将栈顶的控制器移除 - (UIViewController *)popViewControllerAnimated:(BOOL)animated; //回到指定的子控制器 - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; //回到根控制器(栈底控制器) - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
//栈顶控制器
@property(nonatomic,readonly,retain) UIViewController *topViewController;
4> UINavigationController的导航条
一个导航控制器,只有一个导航条。导航条的内容由栈顶控制器决定
特例:返回键上的按钮是由上一个控制器决定的
//导航栏的内容由栈顶控制器的navigationItem属性决定 //UINavigationItem有以下属性影响着导航栏的内容 //左上角的返回按钮 @property(nonatomic,retain) UIBarButtonItem *backBarButtonItem; //中间的标题视图 @property(nonatomic,retain) UIView *titleView; //中间的标题文字 @property(nonatomic,copy) NSString *title; //左上角的视图 @property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem; //UIBarButtonItem *rightBarButtonItem 右上角的视图 @property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
5> 综合示例:
1.第一个子控制器设置的代码
@implementation LYXOneViewController //子控制器加载完毕后调用的方法 - (void)viewDidLoad { [super viewDidLoad]; //中间的标题文字 self.navigationItem.title = @"第一个控制器"; //左上角的视图,左上角为返回键,除了根子控制器外一般不设置此属性 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:(UIBarButtonSystemItemCompose) target:nil action:nil]; //修改下一个界面返回按钮的文字 //返回键不需要设置style属性,因为它的style是默认的 self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:(UIBarButtonItemStyleDone) target:nil action:nil]; } //跳到下一个子控制器的按钮方法 - (IBAction)jumpTwo:(id)sender { //跳到第二个界面 LYXTwoViewController *two = [[LYXTwoViewController alloc] init]; //拿到导航控制器 [self.navigationController pushViewController:two animated:YES]; }
2.第二个子控制器的代码:
@implementation LYXTwoViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. //中间的标题文字 self.navigationItem.title = @"第二个控制器"; //中间的的标题视图 self.navigationItem.titleView = [UIButton buttonWithType:(UIButtonTypeContactAdd)]; //右上角的视图 self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:(UIBarButtonSystemItemCompose) target:nil action:nil]; //右上角的视图组 //self.navigationItem.rightBarButtonItems //用法与rightBarButtonItem属性相同,但传入但是UIBarButtonItem变量的数组 } - (IBAction)hehe:(id)sender { //跳到第三个界面 LYXThreeViewController *two = [[LYXThreeViewController alloc] init]; //拿到导航控制器 [self.navigationController pushViewController:two animated:YES]; }
3.第三个子控制器的代码:
@implementation LYXThreeViewController - (void)viewDidLoad { [super viewDidLoad]; //中间的标题文字 self.navigationItem.title = @"第三个控制器"; //右上角的视图 self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:(UIBarButtonSystemItemCompose) target:nil action:nil]; } //返回根子控制器的方法(此处为LYXOne) - (IBAction)rootBtn:(id)sender { [self.navigationController popToRootViewControllerAnimated:YES]; } //返回上一个子控制器(此处为LYXTwo) - (IBAction)backBtn:(id)sender { [self.navigationController popViewControllerAnimated:YES]; }
四、storyboard导航实现多控制的使用
1> 创建一个Single View Application工程
2> 打开Main.storyboard,把默认的View删除。添加Navigation Contrller控件
1.添加Navigation Contrller控件,把系统自带的子控制器删除
2.设置View Controller属性,使Navigation Contrller为程序的入口点
3> 根据需要创建继承自UIViewContrller的类,他们将是Navigation Contrller的子控制器
这里将创建两个
4> 根据第三步创建的类的个数添加相应数量的View Contrller
1.添加第一个子控制器(类型是View Contrller)
2.设置子控件的View Contrller中的Class属性为第3步创建的类(此处为LYXOneViewController)
3.添加第二个子控制器(类型是View Contrller)
4.设置子控件的View Contrller中的Class属性为第3步创建的类(此处为LYXTwoViewController)
5> 拖线,实现关联。并设置属性
1.右击Navigation Contrller,选择root view controller,把线托给刚创建的One View Contrller,让它成为Navigation Contrller的根子控制器
2.在One View Contrller上新建一个按钮,按住control拖线到Two View Contrller,选择push属性,建立关联
3.效果图:
4.设置子控制器标题的属性:

浙公网安备 33010602011771号