UIKit框架(11)导航控制器UINavigationController
介绍多控制器管理中非常重要的一个控制器UINavigationController
它负责管理多个控制器,能够轻松完成控制器间的切换
如:iOS系统上的设置
父类是UIViewController,但其功能并非是管理view,而是管理多个控制器
控制器栈式管理:
当切换时,将一个控制器入栈,当返回时,栈顶控制器出栈
当前显示的永远是栈顶控制器的view,栈结构如下:
@property(nonatomic,copy)NSArray*viewControllers//管理的所有控制器@property(nonatomic,readonly,retain)UIViewController*topViewController//当前显示的控制器
代码使用导航控制器
导航控制器的创建:
-(instancetype)initWithRootViewController:(UIViewController*)rootViewController
rootViewController参数:根控制器,即管理的第一个页面
跳转动作:
使用导航控制器的pushViewController方法:
-(void)pushViewController:(UIViewController*)viewControlleranimated:(BOOL)animated
也就是说,跳转动作的执行者是导航控制器,而不是源控制器
源控制器可以通过它的属性访问到导航控制器:
@property(nonatomic,readonly,retain)UINavigationController*navigationController
如一个跳转动作:
AMViewController*vc=[[AMViewControllerTwoalloc]init];[self.navigationControllerpushViewController:vcanimated:YES];
返回动作:
非根控制器的导航栏上,都默认有一个返回按钮,点击此按钮能够自动返回
也可以通过代码返回,导航控制器的方法:
-(UIViewController*)popViewControllerAnimated:(BOOL)animated//返回一个控制器-(NSArray*)popToViewController:(UIViewController*)viewControlleranimated:(BOOL)animated//返回到指定控制器-(NSArray*)popToRootViewControllerAnimated:(BOOL)animated//返回到根控制器
storyboard使用导航控制器
删除storyboard默认的控制器,添加 UINavigationController,并设置为初始控制器。
添加一个控制器,连接导航控制器的root view controller属性
控制器间的跳转可以直接连线,选择show
同样支持自动型Segue和手动型Segue
控制器之间传递数据和modal方式切换一样
导航栏上按钮的添加
导航栏上的按钮类型是UIBarButtonItem
导航栏
导航控制器除了管理多个控制器外,还有一个到导航栏,相关属性:
@property(nonatomic,readonly)UINavigationBar*navigationBar//导航栏@property(nonatomic,getter=isNavigationBarHidden)BOOLnavigationBarHidden//导航栏隐藏使能
导航栏上的数据由UINavigationItem对象管理,其属性如下:
@property(nonatomic,copy)NSString*title//中间的标题@property(nonatomic,retain)UIView*titleView//中间的视图@property(nonatomic,retain)UIBarButtonItem*backBarButtonItem//左侧的返回按钮@property(nonatomic,retain)UIBarButtonItem*leftBarButtonItem//左侧自定义按钮@property(nonatomic,copy)NSArray*leftBarButtonItems@property(nonatomic,retain)UIBarButtonItem*rightBarButtonItem//右侧自定义按钮@property(nonatomic,copy)NSArray*rightBarButtonItems
导航栏对象UINavigationBar管理显示数据的方式和导航控制器管理多个控制器类似,也是用栈的结构:
@property(nonatomic,copy)NSArray*items@property(nonatomic,readonly,retain)UINavigationItem*topItem
但通常不直接使用导航栏对象来设置显示的数据
UIViewController包含一个navigationItem属性:
@property(nonatomic,readonly,retain)UINavigationItem*navigationItem
通过这个属性,能够直接设置当前页面的导航栏数据
工具栏
导航控制器还管理着一个工具栏,这个工具栏默认是隐藏的
@property(nonatomic,readonly)UIToolbar*toolbar-(void)setToolbarHidden:(BOOL)hiddenanimated:(BOOL)animated@property(nonatomic,getter=isToolbarHidden)BOOLtoolbarHidde
工具栏UIToolBar管理方式导航栏UINavigationBar的管理方式类似
UIViewController包含一个tabBarItem属性:
@property(nonatomic,readonly,retain)UINavigationItem*navigationItem
通过这个属性,能够直接设置当前页面的工具栏数据
@property(nonatomic,retain)UITabBarItem*tabBarItem
导航控制器子类
定义一个导航控制器子类的好处是:
让项目中所有的导航控制器都遵循统一的一些行为,应让所有的导航控制器为自定义的UINavigationController的子类,在子类中设定这些统一的行为。
UINavigationBar设置背景图片
-(void)setBackgroundImage:(UIImage*)backgroundImageforBarMetrics:(UIBarMetrics)barMetrics
UINavigationBar设置文字属性
@property(nonatomic,copy)NSDictionary*titleTextAttributes
一些控件遵循<UIAppearance>协议,通过协议中的appearance方法能够返回全局对象
+(instancetype)appearance
通过全局对象能够设置一些全局的特征
设置导航栏的tintColor
[UINavigationBarappearance].tintColor=[UIColorwhiteColor];
设置导航栏按钮的字体
[UIBarButtonItemappearance]setTitleTextAttributes:attrDictforState:UIControlStateNormal];
全局的属性设置,执行一次即可
将这些代码放在导航控制器的viewDidLoad方法中,当出现多个导航控制器时,全局属性设置会执行多次。
保证全局属性只执行一次的方案是添加到initialize方法中
另外可以使用一个类,管理所有UIKit对象的appearance的设置,用以实现App皮肤的切换
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。