UIView是iOS开发中所有视图的基类, 表示屏幕上的一块矩形区域, 同时可以处理该区域的绘制和触摸事件. UIViewController是视图控制器的基类, 用来处理屏幕之间的切换等操作, 提供视图管理模型. 一个UIViewController管理一个层级的UIView. 而RootViewController就是iOS应用启动时被载入的第一个视图控制器(可在main.storyboard中指定), 展示APP启动成功后的第一个界面. 因此, iOS中在各个UIViewController之间的切换操作显得尤为重要, 其直接决定了应用各个界面之间的切换效果. 主要的跳转方式有以下几种:
## UITabBarController
UITabBarController主要用于平级View的跳转, 应用案例如微信界面下方的四个Tab。可选中一个UIViewController, 在Xcode->Editor->Embed In-> Tab Bar Controller将其加入到一个Tab bar中. 也可以在storyboard中直接从UITabBarController中连线至一个View, 选择Relationship Segue的view controllers即可.
### property
tabbar里边包含的每一个viewController都对应一个tabbarItem, 位置都是均分的, 最多显示4个tab, 再多了就会折叠起来. 通过代码来设置tabbar的时候, 可以使用setViewControllers来添加指定的子ViewController为其item.
tabbarItem有title, image, selectedImage, badgeValue属性, badgeValue是该item右上角的提醒数字. 而selectedIndex和selectedViewController则定位到当前选取的tabbarItem.
除此之外, 还有viewControllers, selectedViewController, selectedIndex等属性, 含义就不罗嗦了.
### UITabBarControllerDelegate
该协议用于在选取某一个tabbarItem的时候, 执行一些额外的操作, 监控tabbar的改变, 也可以阻止某一个tabbarItem被选取.
## UINavigationController
### 堆栈式View管理
UINavigationController是IOS开发中常用的用于视图切换的控制器, 提供堆栈式的View管理方式, RootViewController在stack的最底层. 提供了诸多方法用于进行view之间的切换及管理等, 如
pushViewController与popViewController等. 详细内容, 可参考之前的一篇博客[UINavigationController的简单总结](http://blog.csdn.net/icetime17/article/details/42113591).
一般使用UINavigationController的方式, 会自动为我们设置好每个View界面的标题, 左上角的返回按钮, 以及屏幕右滑回退的操作. 如果想要禁止屏幕右滑返回等的手势操作, 可以在当前View的viewDidAppear方法中设置如下:
```swift
self.navigationController.interactivePopGestureRecognizer.enabled = NO; // 禁止右滑等手势
```
需要注意的是 UINavigationController是采用类似stack的push和pop的方式完成view的切换, 调用方法为pushViewController和popViewController. 而segue属性也要相应地设置为push.
使用viewControllers属性可以获取当前的视图栈.
### property
toolbarHidden是用于隐藏navigationController最上方的导航工具栏. 在该工具栏中, 我们可以自行添加各种Bar Button Item控件. 常见的是leftBarButtonItem和rightBarButtonItem.
UINavigationItem是该View栈中的每一项. 可以在Storyboard或xib文件中指定, 也可以自行代码创建, 然后加到UINavigationController中去即可.
### UINavigationControllerDelegate
该协议为NavigationController中的View跳转, 提供了很多遍历的方法.如: didShowViewController, willShowViewController, animationControllerForOperation等. 而枚举UINavigationControllerOperation中定义了View之间跳转的方式(None, Push, Pop).
## 使用nib文件
nib文件是一系列UIView的组合.
```swift
NSArray *arrayMessage = [[NSBundle mainBundle] loadNibNamed:@“ViewMessageCenter” owner:nil options:nil];
self.vMessageCenter = [arrayMessage objectAtIndex:0];
self.vMessageCenter.navigationController = self.navigationController;
self.vMessageCenter.frame = self.vMainPanel.bounds;
```
## 使用storyboard
将一个ViewController放在storyboard中, 然后调用instantiateViewControllerWithIdentifier, 加载一个storyboard文件中的对应ID的storyboard(一系列view的集合), 也是非常常用的一种方式.
```swift
UIStoryboard *sb = [UIStoryboard storyboardWithName:@“Main” bundle:nil];
LoginViewController *vc = [sb instantiateViewControllerWithIdentifier:@“LoginViewController”];
[self.navigationController popToRootViewControllerAnimated: YES];
[self.navigationController presentViewController: vc animated: YES completion:nil];
```
## 使用nib文件
Nib文件是一种特殊类型的资源文件, 保存Interface Builder文档, 可以进行可视化编辑.
每一个xib文件对应一个ViewController或者一个自定义的View, 可以使用loadNibNamed:方法来加载nib文件
```swift
NSArray *arrayMessage = [[NSBundle mainBundle] loadNibNamed:@“ViewMessageCenter” owner:nil options:nil];
self.vMessageCenter = [arrayMessage objectAtIndex:0];
self.vMessageCenter.navigationController = self.navigationController;
self.vMessageCenter.frame = self.vMainPanel.bounds;
```
## segue
对于两个单独的ViewController, 可以使用segue指定跳转方式.
如在storyboard中, 在VC1中的button上右键, 连线至第二个VC, 选择跳转方式即可实现两个VC之间的相互跳转.
如果想通过点击一个image, 实现VC的跳转呢? 这就要引入gesture了.
```objective-c
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
```
View加载的时候设置手势:
```swift
self.imageView.userInteractionEnabled = YES;
UITapGestureRecognizer *imageTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped)];
[self.imageView addGestureRecognizer:imageTap];
```
### 通过addSubView
如self.view.addSubView(newView) 即可直接加载UIView, 使用removeFromSuperview将该UIView移除.