IOS学习——Navigation Controller

原创 2015年11月20日 15:59:29

NavigationController:导航控制器,一个月前接触的时候,这个地方比较让我懵~逼,主要原因是没有搞清楚IOS各种View控件的关系,每次查各位前辈都给出了官方的图,这个图不经意间都看了好多遍了,所以慢慢就理解NavigationController在视图中所处的位置了,照例上图看水果的介绍):

So~~,如果window是最底层的话,那么接下来就是Navigation,因为我们看到和使用的比较基础的应用,都使用到了位于页面最上方和最下方的导航栏,而这些导航栏是NC提供的。公司的师傅叫我先尽量不要用storyboard来建立页面,因为之前项目都是手码的页面,团队更好维护,所以在新建完一个项目后,如何快速搭建起一个可用的视图框架呢?下面是我搜集的方法,比较程式化列出过程,希望有所帮助:

一、搭建基础框架——window、View Controller、NavigationViewController

1、AppDelegate.h 应用的代理类中
    
#import <UIKit/UIKit.h>

@interfaceAppDelegate:UIResponder<UIApplicationDelegate>

@property(strong,nonatomic)UINavigationController*navigationController;
@property(strong,nonatomic)UIWindow*window;

@end

2、AppDelegate.m 

在这里我们大家各种视图控制器ViewController,由于需要在每个页面转为Active时,就应该把视图加载好,所以这部分工作放在didFinishLaunchingWithOptions中。

再提一点,就是我们页面框架无非就是那么几类,比如在最下方,有几个导航按钮,每个按钮对应一个页面,这种页面框架有个特殊的建立方式,就是UITabBarController,这个类中封装了这类页面需要的元素,比如那几个导航按钮;

又或者还有一种页面,直接就是一个上方有个导航栏的单页面,无非在加个左右按键啥的或者segmented button,这种就只是单纯的NavigationController了。

下面基于这两种结构建立页面

2-1基于UITabBarController

#import "AppDelegate.h"
#import "Item1ViewController.h"
#import "Item2ViewController.h"
#import "Item3ViewController.h"
#import "Item4ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
    //shemging and set root VC
    UITabBarController *tabBarController = [[UITabBarController alloc]init];
    self.window.rootViewController = tabBarController;
    //init 4 VC on this TabBatController
    Item1ViewController *vc1 = [[Item1ViewController alloc]init];
    Item2ViewController *vc2 = [[Item2ViewController alloc]init];
    Item3ViewController *vc3 = [[Item3ViewController alloc]init];
    Item4ViewController *vc4 = [[Item4ViewController alloc]init];
   
    UINavigationController *navc1 = [[UINavigationController alloc]initWithRootViewController:vc1];
    UINavigationController *navc2 = [[UINavigationController alloc]initWithRootViewController:vc2];
    UINavigationController *navc3 = [[UINavigationController alloc]initWithRootViewController:vc3];
    UINavigationController *navc4 = [[UINavigationController alloc]initWithRootViewController:vc4];
   
    NSArray *controllers = [NSArray arrayWithObjects:navc1,navc2,navc3,navc4, nil];
   
    tabBarController.viewControllers = controllers;
   
    //item title
    navc1.title = @"1";
    navc2.title = @"2";
    navc3.title = @"3";
    navc4.title = @"4";
   
    //insert image
    navc1.tabBarItem.image = [UIImage imageNamed:@"Office_Excel.png"];
    navc2.tabBarItem.image = [UIImage imageNamed:@"Office_Frontpage.png"];
    navc3.tabBarItem.image = [UIImage imageNamed:@"Office_Words.png"];
    navc4.tabBarItem.image = [UIImage imageNamed:@"OE3.png"];
   
    //show
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}
这个是针对每个item确定的页面都是可定制的,vc1、2、3、4都是自建类的对象,或者我在网上找到一个功能设置的运用更全面的方式:

#import"AppDelegate.h"
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//1.创建Window
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
     self.window.backgroundColor = [UIColor whiteColor];
//a.初始化一个tabBar控制器
     UITabBarController *tb=[[UITabBarController alloc]init];
//设置控制器为Window的根控制器
     self.window.rootViewController=tb;
//b.创建子控制器
     UIViewController *c1=[[UIViewController alloc]init];
     c1.view.backgroundColor=[UIColor grayColor];
     c1.view.backgroundColor=[UIColor greenColor];
     c1.tabBarItem.title=@"消息";
     c1.tabBarItem.image=[UIImage imageNamed:@"tab_recent_nor"];
     c1.tabBarItem.badgeValue=@"123";
     UIViewController *c2=[[UIViewController alloc]init];
     c2.view.backgroundColor=[UIColor brownColor];
     c2.tabBarItem.title=@"联系人";
     c2.tabBarItem.image=[UIImage imageNamed:@"tab_buddy_nor"];
     UIViewController *c3=[[UIViewController alloc]init];
     c3.tabBarItem.title=@"动态";
     c3.tabBarItem.image=[UIImage imageNamed:@"tab_qworld_nor"];
     UIViewController *c4=[[UIViewController alloc]init];
     c4.tabBarItem.title=@"设置";
     c4.tabBarItem.image=[UIImage imageNamed:@"tab_me_nor"];
//c.添加子控制器到ITabBarController中
//c.1第一种方式
//    [tb addChildViewController:c1];
//    [tb addChildViewController:c2];
//c.2第二种方式
     tb.viewControllers=@[c1,c2,c3,c4];
//2.设置Window为主窗口并显示出来
    [self.window makeKeyAndVisible];
    return YES;
}
@end



2-2 基于NavigationController

#import "AppDelegate.h"
#import "ViewController.h"

@implementation AppDelegate
 
-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    //1
    self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
   
    //2
    ViewController *rootView = [[ViewController alloc]init];
    rootView.title = @"root view";
   
    //3
    self.navigationController = [[UINavigationController alloc]init];
    [self.navigationController pushViewController:rootView animated:YES];
    //self.navigationController = [[UINavigationController alloc]initWithRootViewController:rootView];
   
    //4
    self.window.rootViewController = self.navigationController;    
   
    //5
    [self.window addSubview:self.navigationController.view];
   
    //6
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
   
    return YES;

}
 
@end

或者更可读性更好的写法
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    self.window=[[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]autorelease];
 
    self.window.backgroundColor=[UIColor whiteColor];
    self.viewController=  [[TestViewController alloc]init];
    self.navController=[[UINavigationController alloc]initWithRootViewController:self.viewController];
    [self.window addSubview:navController.view];
 
    [self.window makeKeyAndVisible];
    returnYES;
}

之后就可以在对应的页面类中添加各种view组件了,如button,label,textfield,imageview,tableview,scrollview,或者以他们作为基类的第三方库,用库做开发还是很搞笑的,哦不对,是高效!!!

(这个表格删不掉了~—~)

 

二、NavigationController中的一些Item

2-1NavigationController常用函数触发时机

  •     当视图控制器的View将要出现时触发 

        - (void)viewWillAppear:(BOOL)animated

  •     当视图控制器的View已经出现时触发 

        - (void)viewDidAppear:(BOOL)animated

  • 当视图控制器的View将要消失时触发 

        - (void)viewWillDisappear:(BOOL)animated

  • 当视图控制器的View已经消失时触发 

        - (void)viewDidDisappear:(BOOL)animated


当由前一个界面,push下一个界面时,如A push B,四个方法执行顺序   

            A(ViewWillDisappear)>B(viewWillAppear)>A(viewDidDisappear)>B(viewDidAppear) 

当由后一个界面pop前一个界面时,如B pop A,四个方法执行顺序

            B(viewWillDisappear)>A(viewWillAppear)>B(viewDidDisappear)>A(viewDidAppear) 


2-2 NavigationBar常用属性

一. 对navigationBar直接配置,所以该操作对每一界面navigationBar上显示的内容都会有影响(效果是一样的)

    1.修改navigationBar颜色  

        

self.navigationController.navigationBar.barTintColor = [UIColor redColor];

    2.关闭navigationBar的毛玻璃效果

        

self.navigationController.navigationBar.translucent = NO;  

    3.将navigationBar隐藏掉

        

self.navigationController.navigationBarHidden = YES;

    4.给navigationBar设置图片  

        不同尺寸的图片效果不同:

        1).320 * 44,只会给navigationBar附上图片

        2).高度小于44,以及大于44且小于64:会平铺navigationBar以及状态条上显示

        3).高度等于64:整个图片在navigationBar以及状态条上显示

                          

[self.navigationController.navigationBarsetBackgroundImage[UIImageimageNamed:@"32050"]forBarMetrics:UIBarMetricsDefault];

二.navigationBar上显示的内容单独定制(每个界面显示内容不一样)

单独定制,修改视图控制器的navigationItem  

    1.设置界面的title

        

self.navigationItem.title = @"锰酸钾拌饭”;

    2.修改titleView,添加个segment啥的,或者label

        

UISegmentedControl *segment = [[UISegmentedControl  alloc] initWithItems:@[@"氧气", @"水"]];           
        self.navigationItem.titleView = segment;[segment release]; 

    3.修改navigationBar的颜色

        

self.navigationController.navigationBar.barTintColor = [UIColor redColor];

    4.修改navigationBar,右边显示内容

        

UIBarButtonItem *right = [[UIBarButtonItem alloc] initWithBarButtonsystemItem:UIBarButtonSystemItemAdd 
target:self 
action:@selector(rightButton:)];
self.navigationItem.rightBarButtonItem = right; 

    5.leftBarButtonItem添加方法是一样的


因为都是之前在云笔记上整理好的,所以更新速度有点快,而且有些知识是做笔记时前辈写的东西,如有部分雷同,谢谢前辈!


版权声明:本文为博主原创文章,未经博主允许不得转载。

IOS 学习九 Navigation Controller 的使用示例

1.新建Single View Application项目命名为RecipeBook 2.选中当前的ViewController,点击菜单Editor-Embed in-Navigation Cont...
  • xundh
  • xundh
  • 2015年04月30日 16:42
  • 488

iOS开发之导航栏Navigation Controller的使用

正如在android开发中在界面顶端会有一个Action Bar一样,在iOS中也会在上方会有一个导航栏,这个导航栏可以进行返回,显示本页标题等功能。我在之前两篇博客中提到的2种返回方式都需要编写代码...

iOS开发17:使用Navigation Controller切换视图

之前有两篇文章讲了使用Tool Bar和Tab Bar切换视图。其实,切换视图并不复杂,无非就是View Controller的切换。 这篇文章介绍使用UINavigationControlle...

iOS9+Swift开发经验不定期汇总(2): 企业账号应用不受信任,自定义Navigation Controller左上角返回按钮,CLLocationManager停止获取GPS等

好久没有更新blog了,最近一直在忙着写代码结项,所以很多总结都攒到一块了。一块说一下吧 企业账号发布应用提示不信任 更新了iOS9之后,很多用户反映我们的应用安装之后打不开,总是提示不受信任的开...

iOS开发16:使用Navigation Controller切换视图

之前有两篇文章讲了使用Tool Bar和Tab Bar切换视图。其实,切换视图并不复杂,无非就是View Controller的切换。 这篇文章介绍使用UINavigationControlle...
  • jidiao
  • jidiao
  • 2012年08月24日 11:40
  • 539

iOS学习笔记——导航栏(Navigation)

在AppDelegate.m文件中添加,如下代码,更改根视图控制器。 //创建导航栏控制器的对象,初始化根视图 UINavigationController * pNavigation...

IOS开发学习笔记——Navigation学习

将ios开发中navigation开发的基本内容小结如下:      一、navigationController层次关系             首先需要知道对于每一个app来说都有一个wind...

Objective-C学习之Container View Controller

Container一个iOS的app很少只由一个ViewController组成,除非这个app极其简单。 当有多个View Controller的时候,我们就需要对这些View Controller...
  • yxys01
  • yxys01
  • 2016年05月26日 14:42
  • 1522

《iOS Human Interface Guidelines》——Navigation

本文翻译自苹果官方文档《iOS Human Interface Guidelines》——Navigation,讲解导航

iOS Apps 开发(Swift)(9)——Implement Navigation

前言:网上一直没有找到用Swift开发IOS的好的教程,所以找了官网的文档翻译一下算了。如有错误欢迎指正。 原文链接:Implement Navigation ————————————————————...
  • mcf171
  • mcf171
  • 2016年02月28日 22:06
  • 445
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS学习——Navigation Controller
举报原因:
原因补充:

(最多只允许输入30个字)