IOS开发中是通过控制器来管理控制器的。
一、控制器的创建及生命周期
1. 控制器常见的创建方式有以下几种
MJViewController *mj = [[MJViewController alloc] init];
MJViewController *mj = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
2. 通过storyboard创建控制器
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
(1)初始化“初始控制器”(箭头所指的控制器)
MJViewController *mj = [storyboard instantiateInitialViewController];
(2)通过一个标识初始化对应的控制器
MJViewController *mj = [storyboard instantiateViewControllerWithIdentifier:@”mj"];
3. MJViewController的view的创建
以下是苹果官方文档的截图,实际上官方文档省略了一些步骤,可能是因为那是很久写的文档,没有更新吧。。
4. 控制器view的延迟加载
(1)UINavigationController
三、多控制器管理之UINavigationController(2)UITabBarController
1. UINavigationController
(1)初始化UINavigationController(2)设置UIWindow的rootViewController为UINavigationController(3)根据具体情况,通过push方法添加对应个数的子控制器
2. UINavigationController的子控制器
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
(1)将栈顶的控制器移除
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
(2)回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
(3)回到根控制器(栈底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
(1)左上角的返回按钮(只有这个属性由上一个控制器管理,其他由栈顶控制器决定)
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
(2)中间的标题视图
@property(nonatomic,retain) UIView *titleView;
(3)中间的标题文字
@property(nonatomic,copy) NSString *title;
(4)左上角的视图
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
(5)UIBarButtonItem *rightBarButtonItem 右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
(1)唯一标识
@property (nonatomic, readonly) NSString *identifier;
(2)来源控制器
@property (nonatomic, readonly) id sourceViewController;
(3)目标控制器
@property (nonatomic, readonly) id destinationViewController;
3. Segue的类型
(1)自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转
(2)手动型:需要通过写代码手动执行Segue,才能完成界面跳转
4. 自动型Segue
[ self performSegueWithIdentifier : @“login2contacts” sender : nil ];// Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用
[self performSegueWithIdentifier:@“login2contacts”sender:nil];
// 这个self是来源控制器
(1)根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象
- 设置Segue对象的sourceViewController(来源控制器)
- 新建并且设置Segue对象的destinationViewController(目标控制器)
(2)调用sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的Segue对象
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender;
// 这个sender是当初performSegueWithIdentifier:sender:中传入的sender
(3)调用Segue对象的- ( void)perform;方法开始执行界面跳转操作
1)如果segue的style是push
取得sourceViewController所在的UINavigationController调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转
2)如果segue的style是modal
调用sourceViewController的presentViewController方法将destinationViewController展示出来
(要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)
3. 逆传
六、多控制器管理之UITabBarController
1. UITabBarController的简单使用
(1)初始化UITabBarController(2)设置UIWindow的rootViewController为UITabBarController(3)根据具体情况,通过addChildViewController方法添加对应个数的子控制器
2. UITabBarController的子控制器
(1)添加单个子控制器
- (void)addChildViewController:(UIViewController *)childController;
(2)设置子控制器数组
@property(nonatomic,copy) NSArray *viewControllers;
3. UITabBarController的view结构
4. UITabBar
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion;