UINavigationController

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UINavigationController相关的知识,希望对你有一定的参考价值。

 1 #import "AppDelegate.h"
 2 #import "RootViewController.h"
 3 @interface AppDelegate ()
 4 
 5 @end
 6 
 7 @implementation AppDelegate
 8 
 9 
10 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
11     // Override point for customization after application launch.
12 #pragma mark - UINagationController的创建
13     self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
14     self.window.backgroundColor = [UIColor greenColor];
15     [self.window makeKeyAndVisible];
16     //1.创建一个根试图控制器
17     RootViewController *rootVc = [[RootViewController alloc] init];
18     //2.创建导航控制器,将rootVC作为其根视图控制器,初始化必须有一个根视图控制器
19     UINavigationController *naVc = [[UINavigationController alloc] initWithRootViewController:rootVc];
20     //3.将naVC作为window的根视图控制器
21     self.window.rootViewController = naVc;
22     naVc.delegate = self;
23     //NSLog(@"%@",naVc);
24     
25     return YES;
26 }
27 #pragma mark - UINavigationControllerDelegate 代理方法
28 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
29 {
30     NSLog(@"%s",__FUNCTION__);
31     //navigationConroller的几个属性
32     NSLog(@"view controllers = %@",navigationController.viewControllers);
33     NSLog(@"top viweController = %@",navigationController.topViewController);
34     NSLog(@"visiableController = %@",navigationController.visibleViewController);
35 }
36 - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
37     
38 }

2.

  1 #import "RootViewController.h"
  2 #import "SencondViewController.h"
  3 @interface RootViewController ()
  4 
  5 @end
  6 
  7 @implementation RootViewController
  8 
  9 - (void)viewDidLoad {
 10     [super viewDidLoad];
 11     // Do any additional setup after loading the view.
 12     self.view.backgroundColor = [UIColor redColor];
 13 #pragma mark - UINavigationBar(导航栏)的设置
 14     /*
 15      设置导航栏的样式barStyle和透明度translucent
 16      */
 17 //    NSLog(@"%@",self.navigationController);
 18 //    //导航栏默认的颜色是白色半透明状态
 19 //    self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
 20 //    self.navigationController.navigationBar.translucent = YES;
 21 //    //第二种 白色不透明
 22 //    self.navigationController.navigationBar.barStyle = 0;
 23 //    self.navigationController.navigationBar.translucent = NO;
 24 //    //第三种 黑色,透明
 25 //    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
 26 //    self.navigationController.navigationBar.translucent = YES;
 27 //    //第四种 黑色, 不透明
 28 //    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
 29 //    self.navigationController.navigationBar.translucent = NO;
 30     /*
 31       设置导航栏的颜色:barTintColor
 32      注意;barTintColor是ios7以后的新特性,此修改不了导航栏的透明度,如果想修改导航栏的透明度,使用backgroundcolor
 33      
 34      
 35      */
 36     //self.navigationController.navigationBar.barTintColor = [UIColor brownColor];
 37     self.navigationController.navigationBar.backgroundColor = [UIColor brownColor];
 38     /*
 39      tintColor设置导航栏控件的颜色,默认的是蓝色
 40      */
 41     self.navigationController.navigationBar.tintColor = [UIColor blueColor];
 42     /*
 43      设置导航栏的背景图片:导航栏的竖屏高度是44;横屏的是36
 44      像素图片:64,44和小于44的(要分清是否是一倍像素的)
 45      */
 46     //一倍像素为:64  =  导航栏 + 状态栏
 47 //    UIImage *image = [UIImage imageNamed:@"NavBar_64"];
 48 //    [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
 49 //    //一倍像素为:44 = 导航栏
 50 //    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar_44"] forBarMetrics:UIBarMetricsDefault];
 51 //    //一倍像素为:小于44,这是不被允许的情况
 52 //    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar_30"] forBarMetrics:UIBarMetricsDefault];
 53     
 54 #pragma mark - 导航栏内容的设置UINavigationItem
 55     //1.在工程里有且仅有一个UINavigationController,导航栏UINavigationBar也是有且仅有一个
 56     //2.导航栏的所有内容基本上都在UINavigationItem
 57     //3.每一个视图控制器都有一个UINavigationItem
 58     
 59     
 60     //设置UINavigationItem的四种方式
 61     //第一种方式:系统默认的
 62 //    UIBarButtonItem  *leftItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(leftBarButtonAction)];
 63 //    self.navigationItem .leftBarButtonItem = leftItem;
 64     
 65     //第二种方式:使用title初始化的方法
 66 //    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithTitle:@"首页" style:UIBarButtonItemStylePlain target:self action:@selector(leftBarButtonAction)];
 67 //    self.navigationItem.leftBarButtonItem = leftItem;
 68     /*
 69     //第三种方式:使用image初始化[此时图片没有保持原图片样式,因为默认是系统原模板样式,此时要实现效果需要对图片进行渲染]
 70     UIImage *image1 = [UIImage imageNamed:@"NavBtnLeft"];
 71     //渲染之后,使用新的UIImage对象去接收
 72     UIImage *image2 = [image1 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
 73     UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithImage:image2 style:UIBarButtonItemStylePlain target:self action:@selector(leftBarButtonAction)];
 74     self.navigationItem.rightBarButtonItem = rightItem;
 75     //第四种方式:使用视图进行初始化
 76     UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
 77     UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:btn];
 78     self.navigationItem.leftBarButtonItem = leftItem;
 79     
 80     */
 81     //使用多个item进行赋值
 82     UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(leftBarButtonAction)];
 83     UIBarButtonItem *item2 =  [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(leftBarButtonAction)];
 84     self.navigationItem.leftBarButtonItems = @[item,item2];
 85     
 86     //使用多个item进行赋值
 87     UIBarButtonItem *item3 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(leftBarButtonAction)];
 88     UIBarButtonItem *item4 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(leftBarButtonAction)];
 89     self.navigationItem.rightBarButtonItems = @[item3, item4];
 90     
 91     
 92     
 93     //中间的一块title和titleView
 94     //self.title = @"首页";
 95    // self.navigationItem.title = @"首页";
 96     
 97     //使用View初始化titleView
 98     self.navigationItem.titleView = [[UISegmentedControl alloc] initWithItems:@[@"消息",@"电话"]];
 99     //隐藏导航栏,默认的为NO
100     //self.navigationController.navigationBarHidden = YES;
101     
102     //设置相关Controller的侧滑手势,navigationController作为根视图控制器才会有侧滑效果,默认为开,可以设置进行关闭
103     self.navigationController.interactivePopGestureRecognizer.enabled = NO;
104     
105 #pragma mark - 页面跳转
106     //创建页面跳转的button
107     UIButton *pushNextControllerBtn = [UIButton buttonWithType:UIButtonTypeSystem];
108     pushNextControllerBtn.frame = CGRectMake(100, 100, 100, 100);
109     [pushNextControllerBtn setTitle:@"push" forState:UIControlStateNormal];
110     [pushNextControllerBtn addTarget:self action:@selector(pushButtonAction) forControlEvents:UIControlEventTouchUpInside];
111     [self.view addSubview:pushNextControllerBtn];
112     
113 #pragma mark - 模态视图
114     UIButton *modelVVBtn = [UIButton buttonWithType:UIButtonTypeCustom];
115     modelVVBtn.frame = CGRectMake(100, 300, 100, 100);
116     [modelVVBtn setTitle:@"model" forState:UIControlStateNormal];
117     [modelVVBtn addTarget:self action:@selector(modelViewControllerAction) forControlEvents:UIControlEventTouchUpInside];
118     [self.view addSubview:modelVVBtn];
119     
120     
121     
122 }
123 #pragma mark - 模态出下一个界面
124 -(void)modelViewControllerAction
125 {
126     //1.创建一个需要模态的下一个Controller的对象
127     SencondViewController *secondVC = [[SencondViewController alloc] init];
128     
129     //2.设置转场动画
130     secondVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
131     
132     //3.模态到下一个界面
133     //参数1:模态将要出现的controller 参数2:动画 参数3:模态完成需要处理的事件
134     [self presentViewController:secondVC animated:YES completion:^{
135         
136     }];
137 }
138 #pragma mark - pushButton事件
139 -(void)pushButtonAction
140 {
141      //创建要跳转的controller
142     SencondViewController *secondVC = [[SencondViewController alloc] init];
143     //利用导航控制器去退出下一个界面
144     [self.navigationController pushViewController:secondVC animated:NO];
145     
146 }
147 #pragma mark - 左侧button的方法
148 - (void)leftBarButtonAction
149 {
150    
151     
152 }
 1 #import "SencondViewController.h"
 2 #import "RootViewController.h"
 3 #import "ThirdViewController.h"
 4 @interface SencondViewController ()
 5 
 6 @end
 7 
 8 @implementation SencondViewController
 9 
10 - (void)viewDidLoad {
11     [super viewDidLoad];
12     // Do any additional setup after loading the view.
13     //注意了:在要推出的界面中,需要修改视图的背景颜色,用于解决跳转界面形似卡顿的一个现象,增加用户体验
14     self.view.backgroundColor = [UIColor blueColor];
15     
16     //创建返回按钮
17     UIButton *popViewController = [UIButton buttonWithType:UIButtonTypeSystem];
18     popViewController.frame = CGRectMake(100, 100, 100, 100);
19     [popViewController setTitle:@"返回" forState:UIControlStateNormal];
20     [popViewController addTarget:self action:@selector(popVCAction) forControlEvents:UIControlEventTouchUpInside];
21     [self.view addSubview:popViewController];
22     
23     //创建PUSH按钮
24     UIButton *pushViewController = [UIButton buttonWithType:UIButtonTypeSystem];
25     pushViewController.frame = CGRectMake(100, 300, 100, 100);
26     [pushViewController setTitle:@"push" forState:UIControlStateNormal];
27     [pushViewController addTarget:self action:@selector(pushViewAction) forControlEvents:UIControlEventTouchUpInside];
28     [self.view addSubview:pushViewController];
29     //创建一个模态返回的按钮
30     UIButton *dismissViewController = [UIButton buttonWithType:UIButtonTypeSystem];
31     dismissViewController.frame = CGRectMake(100, 500, 100, 100);
32     [dismissViewController setTitle:@"push" forState:UIControlStateNormal];
33     [dismissViewController addTarget:self action:@selector(dismissViewAction) forControlEvents:UIControlEventTouchUpInside];
34     [self.view addSubview:dismissViewController];
35     
36 }
37 //模态返回上一层级
38 -(void)dismissViewAction
39 {
40     [self dismissViewControllerAnimated:YES completion:^{
41         
42     }];
43     //push适用于有层级关系一系列视图的跳转,它有层次递进关系,模态仅用于单独功能模块的跳转,不牵扯到主业务流程(登录,注册,拍照,相机)
44 }
45 //返回上一级页面的响应方法
46 -(void) popVCAction
47 {
48 //    //1.返回根视图控制器
49 //    [self.navigationController popToRootViewControllerAnimated:YES];
50 //    //2.返回上一层
51 //    [self.navigationController popViewControllerAnimated:YES];
52     //3.返回到指定的层级 [新手易犯的错,返回指定的Controller不应该创建,应该去桟管理的视图中寻找]
53     //通过打印当前视图控制器所控制的视图,可以找到相应视图的下标
54     NSLog(@"%@",self.navigationController.viewControllers);
55      RootViewController *rootVC = [self.navigationController.viewControllers objectAtIndex:0];
56     [self.navigationController popToViewController:rootVC animated:YES];
57 }
58 - (void)didReceiveMemoryWarning {
59     [super didReceiveMemoryWarning];
60     // Dispose of any resources that can be recreated.
61 }
62 //  推出下一层页面的方法
63 -(void)pushViewAction
64 {
65     ThirdViewController *thirdView = [[ThirdViewController alloc] init];
66     thirdView.view.backgroundColor = [ UIColor magentaColor];
67     UIButton *popViewControllerBtn = [UIButton buttonWithType:UIButtonTypeSystem];
68     [popViewControllerBtn setTitle:@"pop" forState:UIControlStateNormal];
69     popViewControllerBtn.frame = CGRectMake(100, 100, 100, 100);
70     [popViewControllerBtn addTarget:self action:@selector(popViewAction) forControlEvents:UIControlEventTouchUpInside];
71     [thirdView.view addSubview:popViewControllerBtn];
72     [self.navigationController pushViewController:thirdView animated:NO];
73     
74 }
75 -(void)popViewAction
76 {
77     NSLog(@"viewControllers = %@",self.navigationController.viewControllers);
78     UIViewController *viewController = [self.navigationController.viewControllers objectAtIndex:1];
79     [self.navigationController popToViewController:viewController animated:NO];
80 }

 

以上是关于UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

IOS 两种控制器的使用,纯代码UITabBarController 与 UINavigationController

UISearchBar、UITableViewController 和 UINavigationController,在执行本机代码时得到一个 SIGSEGV

iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?

UINavigationController 风格

如何过渡出父 UINavigationController

UINavigationController 疯了吗?