1. 多控制器
- 一个iOS的app很少只由一个控制器组成,除非这个app极其简单
- 当app中有多个控制器的时候,我们就需要对这些控制器进行管理
- 有多个view时,可以用一个大的view去管理1个或者多个小view
- 控制器也是如此,用1个控制器去管理其他多个控制器
比如,用一个控制器A去管理3个控制器B、C、D
控制器A被称为控制器B、C、D的“父控制器”
控制器B、C、D的被称为控制器A的“子控制器”
- 为了便于管理控制器,iOS提供了2个比较特殊的控制器:
- UINavigationController
- UITabBarController
2. UINavigationController
2.1 UINavigationController的使用步骤
- 初始化UINavigationController
- 初始化UINavigationController时, 可以通过initWithRootViewController:方法传入一个控制器作为根控制器
- 这个根控制器永远处于栈底(如果栈中只有一个对象,那么根控制器也处于栈顶)
- 设置UIWindow的rootViewController为UINavigationController
- 根据具体情况,通过push方法添加对应个数的子控制器
2.2 代码创建
- 初始化UINavigationController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//创建窗口,根据屏幕大小设置
_window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 设置window背景颜色
_window.backgroundColor = [UIColor lightGrayColor];
// 创建控制器
UIViewController *mainController = [[UIViewController alloc] init];
// 创建导航控制器,同时给它指定一个根控制器
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:mainController];
// 给窗口指定根视图控制器
_window.rootViewController = nav;
// 让当前窗口成为主窗口并显示
[_window makeKeyAndVisible];
return YES;
}
2.3 给nav添加子控制器的三种方法
1,initWithRootViewController:创建导航控制器时,直接指定一个根控制器。第一次显示出来的自控制器;
2,addChildViewController:此方法是UIViewController的方法,可以用来添加子控制器;
3,通过属性viewControllers进行设置。此属性是UINavigationController的,它可以一次添加多个自控制器;
4,最正常的用法: pushViewController,入栈的方式添加自控制器。
// 使用addChildViewController添加
[nav addChildViewController:mainController];
// 通过属性viewControllers进行设置
nav.viewControllers = @[mainController];
// 通过pushViewController入栈的方式添加自控制器
[nav pushViewController:mainController animated:YES];
2.4 UINavigationController的子控制器
2.4.1 UINavigationController以栈的形式保存子控制器
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;
2.4.2 入栈
- 使用push方法能将某个控制器压入栈
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
2.4.3 出栈
- 返回到上一个控制器(将栈顶的控制器移除)
-(UIViewController *)popViewControllerAnimated:(BOOL)animated;
- 返回到指定的控制器
- 返回根控制器(栈底控制器)
2.5 修改导航栏的内容
- 导航栏的内容由栈顶控制器的navigationItem属性决定
- UINavigationItem有以下属性影响着导航栏的内容
//左上角的返回按钮
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
//中间的标题视图
@property(nonatomic,retain) UIView *titleView;
// 中间的标题文字
@property(nonatomic,copy) NSString *title;
// 左上角的视图
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
// 右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
2.6 UINavigationController常见问题
- 导航条高度:44
- UINavigationController保存子控制起的形式:栈
- 获取UINavigationController下面的所有的子控制器:viewControllers / childViewControllers
- 导航条中按钮使用原始图片不进行系统渲染:
[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
- navigationController 和navigationItem都是通过"控制器"对象调用的
- navigationBar 是通过"导航控制器"对象调用的
- 如果想改变导航条整体的样式 那么应该找 navigationbBar
- 如果想改变导航条上内容找 navigationItem
3. UITableBarController
- UITabBarController和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换。
- UITabBarController的创建过程可以参考UINavigationController
3.1. UITableBarController的界面说明
- 下方的工具条称为UITabBar ,如果UITabBarController有N个子控制器,那么UITabBar内部就会有N 个UITabBarButton作为子控件与之对应。
- UITabBarButton在UITabBar中得位置是均分的,UITabBar的高度为49。
- UITabBar的结构⼤大致如下图所示:
7.2.2 UItabBarItem的重要属性
Paste_Image.png7.2.3 往UITabBarController中添加子控制器
有两种方法UITabBarController中添加子控制器 :
- [tb addChildViewController:c1];
- tb.viewControllers=@[c1,c2,c3,c4];
注意:展示的顺序和添加的顺序一致,和导航控制器中不同,展现在眼前的是导航控制器的根视图控制器也就是第一个添加到导航控制器上的视图
网友评论