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创建方式

  1. 没有xib和storyboard:通过alloc init创建,系统会在需要使用view的时候自动创建一个空白的view作为控制器的view
  2. 通过storyboard创建,自动创建storyboard里面的view
  3. 有指定xib情况下自动创建xib里面对应的view
  4. 有同名的xib会自动找到xib中描述的view作为控制器的view
  5. 有同名但去掉了Controller的时候会自动找到xib中描述的view作为控制器的view
  6. 重写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用于逻辑判断和数据筛选;