UIViewController
UIViewController是iOS里面的视图控制器,也就是我们在应用程序中看到的形形色色的页面。
一个UIViewController控制器可以添加进多个子控制器;如果两个控制器互为父子关系,则它们的view也应该为父子关系;
一、UIViewController的创建方式
1.直接alloc创建
XXViewController *vc = [[XXViewController alloc] init];
2.通过StoryBoard创建
UIStoryboard *storyboard = [UISotyboard storyboardWithName:@"xx" bundle:nil];
// 加载UIStoryboard(注意:仅仅是加载名称叫做xx的storyboard,并不会创建storyboard中的控制器及控件)
XXViewController *vc = [storyboard instantiateInitialViewController]; // 创建storyboard中箭头指向的控制器
XXViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"xxid"];
// 加载指定Identifier对应的控制器
上面通过StoryBoard创建的两种方式都需要在storyboard中指定ViewController所属的类;
3.通过xib创建
TestViewController *tvc = [[TestViewController alloc] initWithNibName:@"xx" bundle:nil]; // 注意xib名字不要后缀
需要指定xx.xib的file’s owner的Custom Class为TestViewController,并且把file’s owner的view指定为其中的一个view;
二、控制器View创建方式
- 没有xib和storyboard:通过alloc init创建,系统会在需要使用view的时候自动创建一个空白的view作为控制器的view
- 通过storyboard创建,自动创建storyboard里面的view
- 有指定xib情况下自动创建xib里面对应的view
- 有同名的xib会自动找到xib中描述的view作为控制器的view
- 有同名但去掉了Controller的时候会自动找到xib中描述的view作为控制器的view
- 重写loadview方法:在controller中重写loadview方法,可以在此创建一个view指定给控制器,一般用于自定义控制器view;loadview方法是懒加载的,需要用到controller的view的时候才会执行该方法,该方法执行完成后会立即调用viewDidLoad方法;
三、重要生命周期或方法
viewWillUnload; // 控制器view即将销毁时调用;
viewDidUnload; // 控制器view完全销毁时调用,在这个方法里面需要清空不需要的属性;
didReceiveMemoryWarning; // 接收到内存警告;
shouldAutorotate
supportedInterfaceOrientations
-(void)viewDidLayoutSubViews // 此方法在ViewController中用来布局子控件(当控制器的view的尺寸发生改变的时候会调用)
四、其它
UIViewController *vc;
vc.title = title; // 相当于同时设置了tabBarItem.title和navigationItem.title
vc.tabBarItem.title = title; // tabBar标签上显示的文字
vc.navigationItem.title = title; // 导航栏上显示的文字
vc.hidesBottomBarWhenPushed = YES; // 当该控件器被push显示出来的时候,自动隐藏底部tabBar;
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
} // 改变状态栏文字颜色为白色
-(BOOL)prefersStatusBarHidden
{
return NO;
} // 隐藏状态栏
-(NSUInteger)supportedInterfaceOrientations
{
retrun UIInterfaceOrientationMaskProtrait;
} // 控制当前控制器支持哪些方向(返回值是UIInterfaceOrientationMask***的类型)
UINavigationController
导航控制器,和UIViewController不同的是,UINavigationController能够管理子UIViewController,能过栈的方式进行入栈(显示)出栈(移除)操作。专门管理具有层级关系内容的导航,每个controller管理各自的视图;
显示在导航控制器上的view永远是栈顶控制器的view,一个导航控制器只有一个导航条,也就是说所有子控制器共用同一个导航条;导航条上显示的内容和栈顶控制器有关,显示的内容由栈顶控制器控制;当push一个子控制器到堆栈后,*前一个控制器的view并没有被立即销毁*;
一个导航控制器的view第一次显示的时候,如果transform的缩放值被更改了,则上面的statusBar的高度不会显示出来,如果必须要缩放,可以先显示view,再立即缩放;
1.控制器的结构组成
UINavigationController是UIViewController的子类,因此也具有view,view包含3个视图;
navigationBar
contentView // (不是属性,通过view来找到)
toolbar // (默认是隐藏的)
2.控制器创建
导航控制器以栈的方式管理所控制的视图,至少要有一个被管理的UIViewController作为rootViewController;
导航界面的对象会被同时创建;为导航控制器设置delegate,监控导航栈的变化,即viewControllers、topController、visibleController等;
注意:导航条显示内容的特例,导航条上的返回按钮的文字,是由上一个控制器决定的,也就是backBarButtonItem;
nav.viewControllers; // 导航控制器的栈
nav.childViewControllers; // 只读
[nav addChildViewController:]; // 添加一个ViewController
3.导航
pushViewController:animated: // 推出下一级controller(入栈)
popViewControllerAnimated: // 返回上一级controller(出栈)
popToRootViewControllerAnimated:
popToViewController:animated: // 导航控制器提供已有的控制实现返回上一级;
一、UINavigationBar
导航栏,是一个容器用来显示提供的其它对象的内容;导航栏显示的内容,可以通过设置UINavigationItem来展示,每个controller都有专属的navigationItem;
导航栏的高度:
iPhone 竖屏 44 横屏 32;
iPad 44;
常用属性及方法
tintColor
barStyle
backgroundColor
translucent
-(void)setBackgroundImage:forBarMetrics:
设置导航条主题
如果要同时设置很多UINavigationBar样式,可以通过设置UINavigationBar的主题的方式来设置以便简化代码;
UINavigationBar *appearance = [UINavigationBar appearance];
[appearance setBackgroundImage: forBarMetrics:UIBarMetricsDefault]; // 设置导航条背景图片
NSMutableDictionary *md = [NSMutableDictionary dictionary];
md[NSFontAttributeName] = [UIFont systemFontOfSize:16];
[appearance setTintColor:]; // 设置导航条返回按钮和图片颜色;
// UIOffsetZero是结构体,需要包装成NSValue对象,才能放进字典|数组中;
md[UITextAttributeTextShadowOffset] = [NSValue valueWithUIOffset:UIOffsetZero]; // 消除阴影
[appearance setTitleTextAttributes:md]; // 设置导航条标题颜色;
二、UINavigationItem
提供navigationBar的显示内容,导航栏是唯一的,每个controller都需要设置,它是UIViewController的一个属性;
leftBarButtonItem; // UIBarButtonItem*
rightBarButtonItem; // UIBarButtonItem*
backBarButtonItem; // UIBarButtonItem*
title;
titleView; // UIView*
每一个被推出来的UIViewController都有一个NavigationItem;NavigationBar会去把controller里面设置好的navigationItem显示出来;backBarButtonItem是上一级navitationItem控制的,如果当前viewController没有设置leftBarButtonItem的话,它将显示出来,实际上左边就是一个透明区域,如果设置了leftBarButtonItem的话,就将覆盖backBarButtonItem;
三、UIBarButtonItem
navigationBar上显示的按钮,可以设置显示在navigationItem上;可以通过一个UIView来初始化一个UIBarButtonItem;
设置UIBarButtonItem主题
UIBarButtonItem *barItem = [UIBarButtonItem appearance];
[barItem setTitleTextAttributes:md fotState: ];
[barItem setBackgroundImage: forState: barMetrics:]; // 设置普通按钮背景图片
[barItem setBackButtonBackgroundImage: forState: barMetrics:]; // 设置返回按钮背景图片
通常将设置UINavigationBar样式和UIBarButtonItem样式放到UINavitagionController的initialize方法中;
UIViewController和UIView是两大基类,前者是MVC中C的基类,后者是MVC中V的基类;
UITabBarController
标签控制器,管理一个选择展示界面,可以控制多个controller,无层级关系,标签栏中的每一个标签关联一个自定义的controller,选择标签切换显示相应的controller根视图;可以通过代理方法监控所有controller的定制变化;
组成部分
contentView:当前展示的controller的view;
tabBar:负责切换显示controller;
属性
selectedIndex; // 当前选中的标签索引,可读写,默认为0;
UITabBarController初始化时通过viewControllers管理多个视图控制器;每个controller的布局可以定制改变;
代理delegate
通过代理方法可以监控controller的选择和定制改变;当tabBarItem超过5个时,系统会自动添加一个更多按钮,点击更多按钮,会把未显示出来的按钮以列表的形式显示出来;
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController NS_AVAILABLE_IOS(3_0){
return YES;
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
// 定制编辑,第二个参数,完成编辑或者开始编辑的时候,会把controllers的顺序列表传递回来;
UITabBar
标签栏,显示每个controller关联的标签;每个controller都有专属的tabBarItem,通过设置UITabBarItem来改变标签栏显示的内容,;
标签栏的高度:49,图标尺寸30 * 30 , 或者 60 * 60;可以自定义外观:图片、颜色;
tintColor; // 选中时的字体颜色
backgroundImage
selectedImageTintColor
UITabBarItem
提供tabBar显示的内容,标签栏是唯一的,每个controller都需要设置;标签栏显示的内容,通过设置UITabBarItem展示;设置title、image、badge等;
-(void)setFinishedSelectedImage: withFinishedUnselectedImage: // 设置选中和未选中的图片条目;controller的tabBarItem,默认系统已经给生成好了一个,但是也可以给自定义赋值;
// 初始化方法
initWithTabSystemItem:UITabBarSystemItemDownloads tag:4 // 使用系统提供的默认的tab样式;
模态视图
模态视图控制器在屏幕上显示,无需成为tabBarController和navigationController的一部分;
modalPresentationStyle; // 模态展示样式
modalTransitionStyle; // 模态切换样式
显示与消失方法
presentViewController:ctrl animated:YES completion:^{}]; // 模态显示
dismissViewControllerAnimated:YES completion:^{}]; // 模态消失
UINavigationController、UITabBarController和UIViewController通常是组合使用的,前两者都是UIViewController的子类,管理的都是UIViewController;
UINavigationController可以嵌套UITabBarController;
UITabBarController可以嵌套UINavigationController;
如果一个控制器是以模态的形式展现出来的,可以调用该控制器或该控制器的子控制器让控制器消失;
UISearchBar\UISearchdisplayController
搜索功能实现用户筛选数据,搜索结果可以以表格的形式展示;系统提供的搜索功能实现:搜索界面展示,搜索文字输入,搜索结果展示,搜索行为检测控制;
UISearchBar和UISearchdisplayController可以实现搜索功能;筛选逻辑需要自己完成;
iOS中用于搜索的控件,提供了用户输入功能、功能按钮的设置、键盘设置。searchBar本身不提供搜索功能逻辑,通过实现代理方法控制搜索,实现搜索功能;
NSPredicate
谓词,用于定义一个逻辑判定,判定结果是一个BOOL;
用途:作为if语句的条件和数据筛选;
通常使用predicateWithFormat来创建一个NSPredicate对象;
举例:self contains [cd] %@ ; 其中[cd]表示不区分大小写,不区分低重音;
参看文档:Documents中搜索predicate format string syntax或者using predicate;
UISearchDisplayController
搜索显示控制器,继承于NSObject,非视图控制器,是一个工具类;它提供控制一个searchBar和一个展示搜索结果的tableView;searchBar需要由开发者创建,然后添加到指定视图,最后提供给搜索控制器;
搜索结果tableView由搜索控制器创建,我们需要指定一个UIViewController负责显示tableView,并且需要为该tableView指定delegate、dataSource;设置代理,实现代理方法控制搜索功能;
初始化流程
需要初始化UISearchBar,添加到某个父视图,提供给displayController管理;
displayController会自动初始化结果TableView,我们需要提供负责显示搜索结果的controller,delegate,dataSource;
UISearchBar是iOS中的搜索控件,真正实现搜索功能需要通过代理方法;UISearchDisplayController是系统封装好的搜索显示控制器,提供了UISearchBar和搜索结果UITableView;NSPredicate用于逻辑判断和数据筛选;