1.如何创建一个控制器
》控制器常见的创建方式有以下几种:
QJViewController *vc = [[QJViewControlleralloc] init];
> QJViewController *vc = [[QJViewControlleralloc] initWithNibName:@"QJViewController"bundle:nil]; // bundle的参数为nil,则默认是:[NSBundle mainBundle]
> QJViewController *vc = [[QJViewController alloc] init]; // 如果有相应的xib文件,则会自动加载,但会经过几步检察。后面讲
》通过storyboard创建控制器:
UIStoryboard*storyboard = [UIStoryboardstoryboardWithName:@"Test"bundle:nil];
QJViewController *vc= [storyboard instantiateInitialViewController];
QJViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@”qjvc"];
》通过xib文件来创建控制器:(1)指明xib文件名,创建方式一:
QJViewController *vc = [[QJViewController alloc] initWithNibName:@"QJViewController" bundle:nil]; // bundle的参数为nil,则默认是:[NSBundle mainBundle]
(2)没有指明xib文件名,创建方式二:
QJViewController *vc = [[QJViewController alloc] init];
先察看QJViewController有没有实现- loadView方法,如果没有实现:则察看有没有QJView.xib文件,如果有则在这个xib文件中加载,如果没有该xib,则再从QJViewController.xib文件中加载所要创建的QJViewController对象。
》创建全程:
2.控制器view的延迟加载
3.多控制器:
》描述:
》UINavigationController
(1)利用UINavigationController,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的“设置”应用
(2)UINavigationController导航控制器的简单使用
@property(nonatomic,copy)NSArray*viewControllers;
@property(nonatomic,readonly)NSArray *childViewControllers;
- (void)pushViewController:(UIViewController*)viewController animated:(BOOL)animated;
- (UIViewController*)popViewControllerAnimated:(BOOL)animated;
- (NSArray*)popToViewController:(UIViewController*)viewController animated:(BOOL)animated;
- (NSArray*)popToRootViewControllerAnimated:(BOOL)animated;
> 显示UINavigationController的子控制器:
每次显示的都是栈顶的子控制器:当一个控制器被放到栈顶后,这时就需要把这个控制器的view显示到UINavigationController的view之上,那么就会先wb
(4)UINavigationController的view结构:> 一个导航栏:navigationItem,与一个UINavigationController的view。
(5)如何修改导航栏的内容
@property(nonatomic,retain)UIBarButtonItem*backBarButtonItem;
@property(nonatomic,retain)UIView *titleView;
@property(nonatomic,copy) NSString *title;
@property(nonatomic,retain)UIBarButtonItem*leftBarButtonItem;
@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> * leftBarButtonItems;
@property(nonatomic,retain)UIBarButtonItem *rightBarButtonItem;
@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *rightBarButtonItems;(6)控制器的view的生命周期调用的方法顺序:
4.Segue
》什么是Segue:Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)
》Segue的属性:
@property (nonatomic, readonly) NSString * identifier;
@property (nonatomic, readonly) id sourceViewController;
@property (nonatomic, readonly) id destinationViewController;
》Segue的类型:
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
// self是来源控制器, Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender;
// 这个sender是当初performSegueWithIdentifier:sender:中传入的sender
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
5.控制器的数据传递
》控制器之间的数据传递主要有2种情况: 顺传 和 逆传
》顺传
(要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)
》逆传
6.UITabBarController
》UITabBarController的子控制器
- (void)addChildViewController:(UIViewController *)childController;
@property(nonatomic,copy) NSArray*viewControllers;
》UITabBarController的view结构
》UITabBar
》UITabBarButton
7.App主流UI框架结构
8.Modal
- (void)presentViewController:(UIViewController*)viewControllerToPresent animated: (BOOL)flagcompletion:(void (^)(void))completion
- (void)dismissViewControllerAnimated:(BOOL)flagcompletion: (void (^)(void))completion;