【iOS】iOS控制器管理,代码,xib,Storyboard,Segue

版权声明:本文为博主原创,如需转载请注明出处。

控制器的创建

如何创建一个控制器

控制器常见的创建方式有以下几种

  • 通过storyboard创建

  • 直接创建

1
ViewController *viewController = [[ViewController alloc] init];
  • 指定xib文件来创建
1
ViewController *viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

通过storyboard创建控制器

先加载storyboard文件(Test是storyboard的文件名)

1
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];

接着初始化storyboard中的控制器

初始化“初始控制器”(箭头所指的控制器)

1
ViewController *viewController = [storyboard instantiateInitialViewController];

通过一个标识初始化对应的控制器

1
ViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@”viewController"];

控制器的 view

ViewController的view的创建



控制器view的延迟加载

控制器的view是延迟加载的:用到时再加载

可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载

控制器的view加载完毕就会调用viewDidLoad方法

多控制器管理

一个iOS的app很少只由一个控制器组成,除非这个app极其简单

当app中有多个控制器的时候,我们就需要对这些控制器进行管理

有多个view时,可以用一个大的view去管理1个或者多个小view

控制器也是如此,用1个控制器去管理其他多个控制器

比如,用一个控制器A去管理3个控制器B、C、D

  • 控制器A被称为控制器B、C、D的“父控制器”
  • 控制器B、C、D的被称为控制器A的“子控制器”

为了便于管理控制器,iOS提供了2个比较特殊的控制器

  • UINavigationController
  • UITabBarController

UINavigationController

UINavigationController

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



UINavigationController的使用步骤

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

UINavigationController的子控制器

UINavigationController以栈的形式保存子控制器

1
@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers; // The current view controller stack.

使用push方法能将某个控制器压入栈

1
2
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
// Uses a horizontal slide transition. Has no effect if the view controller is already in the stack.

使用pop方法可以移除控制器

  • 将栈顶的控制器移除
1
2
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated;
// Returns the popped controller.
  • 回到指定的子控制器
1
2
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
// Pops view controllers until the one specified is on top. Returns the popped controllers.
  • 回到根控制器(栈底控制器)
1
2
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;
// Pops until there's only a single view controller left on the stack. Returns the popped controllers.

UINavigationController的view结构



如何修改导航栏的内容

导航栏的内容由栈顶控制器的navigationItem属性决定

UINavigationItem有以下属性影响着导航栏的内容

  • 左上角的返回按钮
1
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
  • 中间的标题视图
1
@property(nonatomic,retain) UIView          *titleView;
  • 中间的标题文字
1
@property(nonatomic,copy)   NSString        *title;
  • 左上角的视图
1
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
  • 右上角的视图
1
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

Segue

什么是Segue

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



Segue的属性

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

  • 唯一标识

    1
    @property (nonatomic, readonly) NSString *identifier;
  • 来源控制器

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

    1
    @property (nonatomic, readonly) id destinationViewController;


Segue的类型

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

  • 自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转
  • 手动型:需要通过写代码手动执行Segue,才能完成界面跳转

自动型Segue

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



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

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

手动型Segue

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



手动型的Segue需要设置一个标识(如下图)



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

1
2
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
// Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用

如果点击某个控件后,需要做一些判断,也就是说:满足一定条件后才跳转到下一个界面,建议使用“手动型Segue”

performSegueWithIdentifier:sender:

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

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

1
2
[self performSegueWithIdentifier:@“login2contacts” sender:nil];
// 这个self是来源控制器

1.根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象

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


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

1
2
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
// 这个sender是当初performSegueWithIdentifier:sender:中传入的sender

3.调用Segue对象的- (void)perform;方法开始执行界面跳转操作

  • 取得sourceViewController所在的UINavigationController
  • 调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转

Sender参数的传递



控制器的数据传递

控制器之间的数据传递主要有2种情况:顺传和逆传

顺传

控制器的跳转方向: A -> C
数据的传递方向: A -> C
数据的传递方式: 在A的prepareForSegue:sender:方法中根据segue参数取得destinationViewController, 也就是控制器C, 直接给控制器C传递数据
(要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)

UITabBarController

跟UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是QQ、微信等应用



UITabBarController的简单使用

UITabBarController的使用步骤

  • 初始化UITabBarController
  • 设置UIWindow的rootViewController为UITabBarController
  • 根据具体情况,通过addChildViewController方法添加对应个数的子控制器

UITabBarController的子控制器

UITabBarController添加控制器的方式

设置子控制器数组

1
@property(nonatomic,copy) NSArray *viewControllers;

UITabBar

如果UITabBarController有N个子控制器,那么UITabBar内部就会有N个UITabBarButton作为子控件

UITabBarButton里面显示什么内容,由对应子控制器的tabBarItem属性决定

UITabBarItem有以下属性影响着UITabBarButton的内容

  • 标题文字

    1
    @property(nonatomic,copy) NSString *title;
  • 图标

    1
    @property(nonatomic,retain) UIImage *image;
  • 选中时的图标

    1
    @property(nonatomic,retain) UIImage *selectedImage;
  • 提醒数字

    1
    @property(nonatomic,copy) NSString *badgeValue;

App主流UI框架结构



除了push之外,还有另外一种控制器的切换方式,那就是Modal

任何控制器都能通过Modal的形式展示出来

Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止

以Modal的形式展示控制器

1
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion

关闭当初Modal出来的控制器

1
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion;

新博客文章地址:iOS控制器管理,代码,xib,Storyboard,Segue
CSDN文章地址:iOS控制器管理,代码,xib,Storyboard,Segue

文章目录
  1. 1. 控制器的创建
    1. 1.1. 如何创建一个控制器
    2. 1.2. 通过storyboard创建控制器
  2. 2. 控制器的 view
    1. 2.1. ViewController的view的创建
    2. 2.2. 控制器view的延迟加载
  3. 3. 多控制器管理
  4. 4. UINavigationController
    1. 4.1. UINavigationController
    2. 4.2. UINavigationController的子控制器
    3. 4.3. UINavigationController的view结构
    4. 4.4. 如何修改导航栏的内容
  5. 5. Segue
    1. 5.1. 什么是Segue
    2. 5.2. Segue的属性
    3. 5.3. Segue的类型
    4. 5.4. 自动型Segue
    5. 5.5. 手动型Segue
    6. 5.6. performSegueWithIdentifier:sender:
    7. 5.7. 控制器的数据传递
  6. 6. UITabBarController
    1. 6.1. UITabBarController的简单使用
    2. 6.2. UITabBarController的子控制器
    3. 6.3. UITabBar
    4. 6.4. App主流UI框架结构
  7. 7. Modal