控制器与导航笔记

来源:互联网 发布:金蝶kis软件视频教程 编辑:程序博客网 时间:2024/06/06 09:40
1.UIWindow
UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow
iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow
也就说,没有UIWindow,就看不见任何UI界面
添加UIView到UIWindow中两种常见方式:
- (void)addSubview:(UIView *)view;
直接将view添加到UIWindow中,但并不会理会view对应的UIViewController


@property(nonatomic,retain) UIViewController *rootViewController;
自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期
[UIApplication sharedApplication].windows
在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象
(平时输入文字弹出的键盘,就处在一个新的UIWindow中)


[UIApplication sharedApplication].keyWindow
用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow


view.window
获得某个UIView所在的UIWindow




常用方法
- (void)makeKeyWindow;
让当前UIWindow变成keyWindow(主窗口)


- (void)makeKeyAndVisible; 
让当前UIWindow变成keyWindow,并显示出来


2.UIViewController
* 控制器的创建方式
  1),NJViewController *nj = [[NJViewController alloc] init];
  2),
  指定xib文件来创建
   NJViewController *nj = [[NJViewController alloc] initWithNibName:@”NJViewController" bundle:nil];
  3),通过storyboard创建
    方法一:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
    NJViewController *nj = [storyboard instantiateInitialViewController];
    方法二:
    通过一个标识初始化对应的控制器
    NJViewController *nj = [storyboard instantiateViewControllerWithIdentifier:@”nj"];




* 控制器view的创建方式
* view的懒加载
    可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
    控制器的view加载完毕就会调用viewDidLoad方法


 * loadView、viewDidLoad、viewDidUnload、didReceiveMemoryWarning


3.UINavigationController
* 通过“设置”演示基本用途
* 通过非storyboard方式,感受导航的作用
1> 创建导航控制器
2> 设置UIWindow的根控制器
3> push 1个、2个、3个 子控制器
4> 解释push的原理(栈、导航控制器的管理过程)
5> 栈底、栈顶控制器的概念
6> 如何设置导航栏上面的内容、返回文字的设置
7> pop的方法使用
8> push和addChild、viewControllers和childViewController的关系


* 通过storyboard方式,感受导航的作用
初始化UINavigationController时,可以通过initWithRootViewController:方法传入一个控制器作为根控制器,这个根控制器永远处于栈底(如果栈中只有一个对象,那么根控制器也处于栈顶)


UINavigationController的使用步骤
初始化UINavigationController
设置UIWindow的rootViewController为UINavigationController
根据具体情况,通过push方法添加对应个数的子控制器


导航控制器常用方法:
使用push方法能将某个控制器压入栈
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;


使用pop方法可以移除控制器
将栈顶的控制器移除
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
回到根控制器(栈底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;


控制器参数的传递:
控制器之间的数据传递主要有2种情况:顺传和逆传
顺传
控制器的跳转方向: A ----> C
数据的传递方向    : A----> C
数据的传递方式    :  在A的prepareForSegue:sender:方法中根据segue参数取得destinationViewController, 也就是控制器C, 直接给控制器C传递数据
(要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)
逆传
控制器的跳转方向: A---->C
数据的传递方向    : C---->A
数据的传递方式    :  让A成为C的代理, 在C中调用A的代理方法,通过代理方法的参数传递数据给A






导航栏相关知识:
导航栏的内容由栈顶控制器的navigationItem属性决定


UINavigationItem有以下属性影响着导航栏的内容
左上角的返回按钮
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
中间的标题视图
@property(nonatomic,retain) UIView          *titleView;
中间的标题文字
@property(nonatomic,copy)   NSString        *title;
左上角的视图
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
UIBarButtonItem *rightBarButtonItem  右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;






4.UIViewController的生命周期方法、AppDelegate的生命周期方法


UITabBarController
0 0
原创粉丝点击