iOS 导航控制器小结

导航控制器小结

UINavigationController

导航控制器 UINavigationController 是 UIViewController 的子类,但它是用来管理一系列 UIViewController 实例对象的类。在使用方法 - (instancetype)initWithRootViewController:(UIViewController *)rootViewController; 初始化时,需要提供一个控制器对象作为根控制器,相应的这个控制器的视图就是导航控制器的根视图。

导航控制器在管理视图控制器时,类似于栈,先压入栈中的控制器后弹出栈,而栈顶的控制器便是当前设备显示的控制器,这里注意模态显示的视图控制器并不在栈中。下面是常见的压入及弹出视图控制器的方法:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated;
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;

除了上面的方法外,可以直接对栈进行操作,使用方法 - (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated 可以直接改变栈中的控制器,提供的数组中,第一个元素是根控制器,最后一个元素是要显示的控制器,如果在使用该方法时,animation 是 YES ,那么其动画效果分为下面3种:

* 如果要显示的控制器本就是原来栈中的元素,且位于栈顶,那么没有动画效果
* 如果要显示的控制器本就是原来栈中的元素,但不位于栈顶,那么显示弹出的动画效果
* 如果要显示的控制器不在原来栈中,,那么显示推入的动画效果

UINavigationBar

@property(nonatomic,readonly) UINavigationBar *navigationBar;

对于导航控制器而言,导航栏尤显重要,大致分为两种类型,UIBarStyleDefault 白底黑字、UIBarStyleBlack 黑底白字。它有点类似于导航控制器,只不过其管理的是一系列 UINavigationItem 实例对象。但是在导航控制器中,它是由导航控制器管理,我们可以通过 UINavigationBar 的一些方法和属性改变其一些外观,但是对于它的大小、透明度及视图层级结构不应修改。

UINavigationItem

导航栏中管理的 UINavigationItem 实例对象,其实对应着导航控制器中每个视图控制器的 UINavigationItem 实例对象。

@interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,strong) UINavigationItem *navigationItem;
@property(nullable, nonatomic,readonly,strong) UINavigationController *navigationController;
@end

从这个分类中可以看出,当视图控制器被推入栈中后,那么控制器的属性 navigationController 便指向了导航控制器。而属性 navigationItem 则指向了当前导航栏显示的内容。

UINavigationItem 对象中包含了标题、标题视图、返回按钮等内容,除此之外,还可以通过下面的方法添加其他按钮。

@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *leftBarButtonItems NS_AVAILABLE_IOS(5_0);
@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *rightBarButtonItems NS_AVAILABLE_IOS(5_0);
- (void)setLeftBarButtonItems:(nullable NSArray<UIBarButtonItem *> *)items animated:(BOOL)animated NS_AVAILABLE_IOS(5_0);
- (void)setRightBarButtonItems:(nullable NSArray<UIBarButtonItem *> *)items animated:(BOOL)animated NS_AVAILABLE_IOS(5_0);

@property(nonatomic) BOOL leftItemsSupplementBackButton NS_AVAILABLE_IOS(5_0) __TVOS_PROHIBITED;

@property(nullable, nonatomic,strong) UIBarButtonItem *leftBarButtonItem;
@property(nullable, nonatomic,strong) UIBarButtonItem *rightBarButtonItem;
- (void)setLeftBarButtonItem:(nullable UIBarButtonItem *)item animated:(BOOL)animated;
- (void)setRightBarButtonItem:(nullable UIBarButtonItem *)item animated:(BOOL)animated;

在使用上面的方法添加左侧按钮或者右侧按钮时,不应混用,在添加左侧按钮时,若不想返回按钮被替代,可将 leftItemsSupplementBackButton 属性设置为 YES。

UIToolbar

@property(null_resettable,nonatomic,readonly) UIToolbar *toolbar NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;

toolbar 是导航栏中的一个属性,其指向导航控制器管理的一个工具栏,但是这个工具栏中的具体内容,则是由导航控制器中的每个视图控制器决定的。

@interface UIViewController (UINavigationControllerContextualToolbarItems)

@property (nullable, nonatomic, strong) NSArray<__kindof UIBarButtonItem *> *toolbarItems NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;
- (void)setToolbarItems:(nullable NSArray<UIBarButtonItem *> *)toolbarItems animated:(BOOL)animated NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;

@end

由上可知,通过 UIViewController 分类中的方法可以设置导航控制器工具栏中的具体按钮。这个按钮是 UIBarButtonItem 对象实例,而不是 UIButton。并且,UIBarButtonItem 同 UITabBarItem 一样都是 UIBarItem 的子类,UIBarItem 的父类是 NSObject,即它们都不是 UIView 的子类(都不是视图)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS中的导航控制器(UINavigationController)是一种视图控制器容器,用于管理应用程序中的多个视图控制器。它是一种实现iOS中视图控制器之间导航的常用方式,可以使用它来管理应用程序的层级结构。 导航控制器的工作原理如下: 1. 创建导航控制器 在应用程序中创建一个导航控制器,然后将第一个视图控制器添加到该导航控制器中。 ``` let navController = UINavigationController(rootViewController: firstViewController) ``` 2. 添加视图控制器 使用以下方法将要显示的视图控制器添加到导航控制器中。 ``` navController.pushViewController(secondViewController, animated: true) ``` 3. 返回视图控制器 使用以下方法将当前显示的视图控制器返回到导航控制器中的上一个视图控制器。 ``` navController.popViewController(animated: true) ``` 举例来说,假设我们有一个简单的应用程序,它有三个视图控制器:`ViewController1`,`ViewController2`和`ViewController3`。我们通过以下代码创建一个导航控制器,并将`ViewController1`添加为第一个视图控制器: ``` let navController = UINavigationController(rootViewController: ViewController1()) ``` 当用户在`ViewController1`中点击按钮时,我们将跳转到`ViewController2`。我们可以使用以下代码将`ViewController2`添加到导航控制器中: ``` navController.pushViewController(ViewController2(), animated: true) ``` 当用户在`ViewController2`中点击返回按钮时,我们将返回到`ViewController1`。我们可以使用以下代码将当前显示的视图控制器返回到导航控制器中的上一个视图控制器: ``` navController.popViewController(animated: true) ``` 当用户在`ViewController2`中点击另一个按钮时,我们将跳转到`ViewController3`。我们可以使用以下代码将`ViewController3`添加到导航控制器中: ``` navController.pushViewController(ViewController3(), animated: true) ``` 这就是导航控制器的基本工作原理和用法。它可以使我们方便地管理应用程序的视图控制器层级结构,并实现视图控制器之间的导航
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值