免费开源的iOS开发学习平台

UINavigationController介绍:8-UINavigationItem

UINavigationItem类的对象主要用于导航栏上显示的按钮以及标题,一般来说,每个子控制器需要显示的标题以及按钮都不相同,因此,在UIKIT框架中,对于每个子控制器需要显示在导航栏上的标题和按钮,都统一在子控制器中定制。

UINavigationItem的常用属性

UINavigationItem类的对象包含了用于设置导航栏的左侧、右侧以及中间视图的属性。其中:中间可以显示一个UIView类型的titleView,左右两侧可以分别显示一个或者多个按钮。需要注意的是,显示在导航栏两侧的按钮是UIBarButtonItem类的对象,不是UIButton类。在UINavigationItem类中,定义了如下几个与导航栏按钮相关的属性。

  • 中间的标题视图
@property(nullable, nonatomic,strong) UIView  *titleView;
  • 左侧/右侧单个按钮
@property(nullable, nonatomic,strong) UIBarButtonItem *leftBarButtonItem;
@property(nullable, nonatomic,strong) UIBarButtonItem *rightBarButtonItem;
  • 左侧/右侧设置多个按钮。当我们需要在导航栏两侧设置多个按钮时,可以创建若干个UIBarButtonItem对象,然后把这些对象放到leftBarButtonItems或rightBarButtonItems数组中。
@property(nullable,nonatomic,copy) NSArray <UIBarButtonItem *> *leftBarButtonItems ;
@property(nullable,nonatomic,copy) NSArray <UIBarButtonItem *> *rightBarButtonItems ;
  • 标题,如果设置了该属性,titleView不生效,注意:UIViewController类也有一个title属性可以用于设置导航栏的标题,但UINavigationItem的title优先级要高
@property(nullable, nonatomic,copy) NSString *title;
  • 导航栏提示语。效果如下图所示。
@property(nullable,nonatomic,copy)   NSString *prompt;

UINavigationItem对象的创建

在UINavigationItem类的API中提供了initWithTitle:方法用于UINavigationItem对象的创建。使用该方法创建的UINavigationItem对象只有中间的标题,左右两侧的按钮(UIBarButtonItem类)需要另外定制。

- (instancetype)initWithTitle:(NSString *)title;

UIBarButtonItem类

UINavigationItem类中定义的按钮,不是UIButton类的,而是UIBarButtonItem类的,并且从UIBarButtonItem类的继承关系来看,其父类并不是UIView,而是UIBarItem,因此,UIBarButtonItem类的并不具备诸如:backgroundColor之类的属性,这是需要程序员特别关注的地方。

@interface UIBarButtonItem : UIBarItem <NSCoding>

在UIBarButtonItem类的定义中,也提供了几种常用的实例化方法,比较常用的有如下两个。

  • 实例化一个只显示文字的按钮
- (instancetype)initWithTitle:(nullable NSString *)title style:(UIBarButtonItemStyle)style target:(nullable id)target action:(nullable SEL)action;
  • 实例化一个只有图标的按钮
- (instancetype)initWithImage:(nullable UIImage *)image style:(UIBarButtonItemStyle)style target:(nullable id)target action:(nullable SEL)action;
  • 当我们需要定制UIBarButtonItem类的外观时,可以使用initWithCustomView:方法,该方法传入一个UIView的参数,可以显示定制样式
- (instancetype)initWithCustomView:(UIView *)customView;