在MVC设计模式中,控制器负责向模型Model申请数据,同时负责控制数据显示到相应的视图View上。
UIViewController是所有控制器的根类,常见的子类有UITableViewController、UICollectionViewController、UINavigationController、UITabbarController等。在App开发过程中,有3种创建控制器的方法,分别是:
通过代码创建控制器(常用)。
通过XIB创建控制器。
通过Storyboard创建控制器。
在Xcode中创建控制器类,继承自UIViewController
// 实例化这个控制器类,并设置为窗口window的根控制器,最后显示出来。
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
MYViewController *rootVc = [[MYViewController alloc] init];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = rootVc;
[self.window makeKeyAndVisible];
return YES;
}
控制器的生命周期
所谓控制器的生命周期,通俗来讲,就是控制器的创建、视图的加载与显示,以及控制器的销毁等操作。
// 控制器初始化方法
-(instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil;
-(nullable instancetype)initWithCoder:(NSCoder *)sDecoder;
// 控制器视图加载与显示方法
-(void)loadView;
-(void)viewDidLoad;
-(void)viewWillApper:(BOOL)animated;
-(void)viewDidApper:(BOOL)animated;
-(void)viewWillDisapper:(BOOL)animated;
-(void)viewDidDisapper:(BOOL)animated;
-(void)viewWillLayoutSubviews NSAVAILABLE_IOS(5_0);
-(void)viewDidlLayoutSubviews NSAVAILABLE_IOS(5_0);
// 控制器销毁时调用的相关方法。
-(void)dealloc;
使用代码切换控制器
1.切换新的控制器
// 通过代码切换控制器的时候,需要首先创建一个目标控制器对象,然后再使用presentViewController方法进行切换。
-(void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void(^ __nullable)(void))completion;
// 示例
-(void)touchesBegan:(NSSet<UITouch *>)touches withEvent:(UIEvent *)event {
UIViewController *newVC = [[UIViewController alloc] init];
newVC.view.backgroundColor = [UIColor redColor];
[self presentViewController:newVC animated:YES completion:nil];
}
2.返回原控制器
// 当需要返回原控制器时,调用dismissViewControllerAnimated:方法,此时该控制器对象会被销毁。
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void(^ __nullable)(void))completion;
-(void)touchesBegan:(NSSet<UITouch *>)touches withEvent:(UIEvent *)event {
UIViewController *newVC = [[UIViewController alloc] init];
newVC.view.backgroundColor = [UIColor redColor];
[self presentViewController:newVC animated:YES completion:^{
dispatch_after(dispatch_time(SIDPATCH_TIME_NOW. (int64_t)(3.0*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self dismissViewControllerAnimated:newVC completion:mil];
});
}];
}
控制器嵌套
// 获取父控制器对象中所有的子控制器,返回一个数组。
@property(nonatomic, readonly) NSArray *childViewControllers;
// 添加子控制器
-(void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
// 移除子控制器
-(void)removeFromParentViewController NS_AVAILABLE_IOS(5_0);
父控制器和子控制之间可以建立通信机制,例如:当点击子控制器上的某个按钮时,通知父控制器跳转到一个新的控制器。父子控制器之间的通信方式可以采用以下两种方式。
代理:在子控制器的类中,添加代理属性和代理方法,并在父控制器中实现代理方法。
通知:当子控制器某个事件发生时,需要通知多个对象时,即一对多,也可以采用通知的方式。