UINavigation导航控制器的使用

 "【导航控制器】"

导航控制器是用来管多个子控制器,实现不同界面间的"来回切换"


导航控制器显示各个子控制器显示的的原理 

 栈顶原理

 0.导航控制器将所要显示的子控制器放到一个栈中

 1.导航控制器显示的第一个控制器为栈顶控制器(此时栈里面就一个控制器)

 2.返回上一个子控制器时,栈顶控制器的view从导航控制器的view中移除,并且栈顶控制器将被销毁

 3.把最新的栈顶控制器的view显示在导航控制器view的上面

 4.所有的子控制器会存储在导航控制器的viewControllers属性中


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;


导航控制器的结构:




导航栏的内容由栈顶控制器的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;


代码创建导航控制器:

</pre><pre name="code" class="objc">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //创建窗口,成为主窗口并可见
    UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    
    window.backgroundColor = [UIColor redColor];
    
    CZOneViewController *oneVc = [[CZOneViewController alloc] init];

    //1.创建导航控制器
    UINavigationController *navContr = [[UINavigationController alloc] initWithRootViewController:oneVc];
    
    //可以通过下面的方法来添加导航控制器第一个显示的控制器
    //UINavigationController *navContr = [[UINavigationController alloc] init];
    //[navContr addChildViewController:oneVc];
    [navContr pushViewController:oneVc animated:NO];
    
    //设置窗口的根控制器为导航控制器
    window.rootViewController = navContr;

    [window makeKeyAndVisible];
    
    self.window = window;
    
    
    return YES;
}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


通过storyboard方式创建导航控制器

效果图:



1、Main.storyboard里面默认有一个viewController,删掉,拖一个UINavigationController


拖进来的导航控制器里面默认的跟控制器是一个TableViewController,在这里我们只要一个viewController就行了,于是删掉,拖一个viewController取名字为“第一个控制器”


2、按住ctrl键脱线,设置第一个控制器为导航控制器的根控制器,或者右键点击选中rootViewController脱线

                                                                                           

双击第一个控制器的导航条的中间位置设置导航条的标题为“第一个控制器

或者选中导航条设置导航条的title属性

                


3、同上创建第二个控制器,从第一个控制器向第二个控制器脱线进行跳转(从第一个控制器上面的按钮脱线)


这种方法创建的导航控制器就跟控制器系统给提供导航栏,这就需要我们在第二个以及以后创建的控制器上拖一个导航栏




注意:如果想从第n个控制器返回到第 n - 1 个控制器就不能在脱线了,必须通过代码实现


自定义导航栏的title:

方法一、设置导航栏的titleView属性

方法二、向导航栏的标题位置拖一个UIView

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

什么是Segue

Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue象(简称Segue


每一个Segue对象,都有3个属性

唯一标识

@property (nonatomic,readonly) NSString  *identifier;

来源控制器

@property (nonatomic,readonly) id   sourceViewController;

目标控制器

@property (nonatomic,readonly) id  destinationViewController;


根据Segue的执行(跳转)时刻,Segue可以分为2大类型

自动型:点击某个控件后(比如按钮),自动执行Segue自动完成界面跳转(不需要条件判断的)
(在storyboard上面直接点按钮拖的线都是自动的,只要你点击这个按钮就会自动跳转)

手动型:需要通过写代码手动执行Segue,才能完成界面跳转(需要条件判断是否跳转)
在恰当的时刻,使用perform方法执行对应的Segue

(手动跳转必须点控制器上面的黄色控制器按钮脱线)



[self  performSegueWithIdentifier:@"login2contacts" sender:nil]; // login2contacts就是对应Segue的唯一标识

// Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用


接下来研究performSegueWithIdentifier:sender:方法的完整执行过程

[self performSegueWithIdentifier:@“login2contacts”sender:nil];

// 这个self是来源控制器

1.根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象
→设置Segue对象的sourceViewController(来源控制器)
→新建并且设置Segue对象的destinationViewController(目标控制器)

2.sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的Segue对象

- (void)prepareForSegue:(UIStoryboardSegue*)segue  sender:(id)sender;

// 这个sender是当初performSegueWithIdentifier:sender:中传入的sender


3.调用Segue对象的- (void)perform;方法开始执行界面跳转操作
取得sourceViewController所在的UINavigationController
调用UINavigationControllerpush方法将destinationViewController压入栈中,完成跳转




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值