第十五章 UINavigationController

  • 利用UINavigationController,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的“设置”应用

UINavigationController

UINavigationController的view结构

UINavigationController的view结构

UINavigationController的简单使用

  • UINavigationController的使用步骤

    1. 初始化UINavigationController
    2. 设置UIWindow的rootViewController为UINavigationController
    3. 根据具体情况,通过push方法添加对应个数的子控制器

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(nullable,nonatomic,strong) UIBarButtonItem *backBarButtonItem
// 导航栏标题
@property(nullable, nonatomic,copy)   NSString        *title;
// 中间标题视图
@property(nullable, nonatomic,strong) UIView          *titleView;
// 左上角按钮
@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *leftBarButtonItems NS_AVAILABLE_IOS(5_0);
// 右上角按钮
@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *rightBarButtonItems NS_AVAILABLE_IOS(5_0);
```objc 
/**
 *  设置左边按钮
 *  ios7之后style中任何样式都没有作用
 *  iOS7之后默认会将导航条渲染成蓝色
 */
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"cell" style:0 target:nil action:nil];```

只要以后看到Item,一般都是苹果提供的模型。

UINavigationItem:控制导航条的内容

UIBarButtonItem:控制导航条上面按钮的内容

    /**
     * 设置右边按钮,加图片。
     * iOS7之后会默认将导航条渲染成蓝色。
     * 有两种更改方法
     * 一种是直接在图片管理器上设置render as
     * 另一种是代码设置
     */
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"navigationbar_friendsearch"] style:0 target:nil action:nil];
- 代码设置方法
 // 在iOS7之后默认会把导航条上面的按钮渲染成蓝色
    UIImage *image = [UIImage imageNamed:@"navigationbar_friendsearch"];

    // 通过代码告诉苹果不要渲染图片
    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
- 图片管理器方法

  • 如果设置展示在导航栏上的按钮,需要有两种状态的情况下需要我们自定义按钮,因为系统UIBarButtonItem,只提供了一种装填。(导航栏上图片尺寸一般为35*35)
  • 导航条上面的内容位置不能由开发者决定,开发者只能控制尺寸
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setImage:[UIImage imageNamed:@"navigationbar_friendsearch"] forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:@"navigationbar_friendsearch_highlighted"] forState:UIControlStateHighlighted];
    // 控件的尺寸由图片决定
    // 仅仅是设置尺寸
    // 按钮的尺寸由图片来定
    [btn sizeToFit];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];

什么是Segue

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

Segue

Segue的属性

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

  • 唯一标识
    @property (nonatomic, readonly) NSString *identifier;
    
  • 来源控制器

    @property (nonatomic, readonly) id sourceViewController;
    
  • 目标控制器

    @property (nonatomic, readonly) id destinationViewController;
    

Segue的属性

Segue的类型

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

    • 自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转

    • 手动型:需要通过写代码手动执行Segue,才能完成界面跳转

自动型Segue

按住Control键,直接从控件拖线到目标控制器 自动型Segue

  • 点击“登录”按钮后,就会自动跳转到右边的控制器

  • 如果点击某个控件后,不需要做任何判断,一定要跳转到下一个界面,建议使用“自动型Segue”

手动型Segue

  • 按住Control键,从来源控制器拖线到目标控制器

手动型Segue

  • 在恰当的时刻,使用perform方法执行对应的Segue

    [self performSegueWithIdentifier:@"login2contacts" sender:nil];
    // Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用
    
  • 如果点击某个控件后,需要做一些判断,也就是说:满足一定条件后才跳转到下一个界面,建议使用“手动型Segue”

performSegueWithIdentifier:sender:

  • 利用performSegueWithIdentifier:方法可以执行某个Segue,完成界面跳转

    [self performSegueWithIdentifier:@“login2contacts” sender:nil];
    // 这个self是来源控制器
    
    • 根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象 设置Segue对象的sourceViewController(来源控制器)

    • 新建并且设置Segue对象的destinationViewController(目标控制器)

Segue方法

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

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
    // 这个sender是当初performSegueWithIdentifier:sender:中传入的sender
    
  • 调用Segue对象的- (void)perform;方法开始执行界面跳转操

    • 如果segue的style是push
    • 取得sourceViewController所在的UINavigationController
    • 调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转
    • 如果segue的style是modal 调用sourceViewController的presentViewController方法将destinationViewController展示出来

Sender参数的传递 Sender参数的传递

results matching ""

    No results matching ""