iOS-UIViewController 视图控制器 传值
解释:
UIViewController 视图控制器 ,是其他控制器的父类,可以添加子控制器嵌套使用。
属于MVC设计模式中得C,获取M数据,把数据传到V上面。
管理内部(整个屏幕)各个view的加载显示和卸载,同时负责与其他ViewController的通信和协调。
分类:
一类主要用于展示内容:
比如UIViewController、UITableViewController等,同时还可以自定义继承自UIViewController的ViewController;
另一类是ViewController容器:
UINavigationController和UITabBarController等,UINavigationController是以Stack的形式来存储和管理ViewController的,UITabBarController是以Array的形式来管理ViewController的。
不管是哪类ViewController,都继承自UIViewController
创建方式:
1 代码
2 xib
3 stroyBoard
关联:
通常通过 UINavigationController配合来切换页面。
设置根控制器:
//在 AppDelegate.m 中写入:
ViewController1* vc = [[ViewController1 alloc] init];
//导航控制器
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:vc];
self.window.rootViewController = nc; //根控制器
//程序自动显示ViewController1文件显示的内容。
控制器跳转/切换、返回:
//在 ViewController1 的事件中写入:
ViewController2* vc2 = [[ViewController2 alloc] init];
[self.navigationController pushViewController:vc2 animated:YES];//(入栈)
//事件执行时 自动转到ViewController2文件中。
//返回上一级controller
popViewControllerAnimated: // (出栈)
//返回根controller
popToRootViewControllerAnimated:
两个页面传值:
//1 可以利用NSUserDefaults。
//2 实例化一个页面直接给他的属性赋值:
ViewController2* vc2 = [[ViewController2 alloc] init];
vc2.vc1 = self;//这个要在2中声明1是一个类 @class ViewController1; 设置成员变量,就可以在2中赋值1
vc2.view.backgroundColor = [UIColor purpleColor];
vc2.str = @"MC";
生命周期、加载过程:
load->initialize->init(initWithNibName)—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc
其中viewWillUnload跟viewDidUnLoad 在iOS6以后就过期了.
LoadView: 控制器调用loadView方法创建控制器的view.当控制器的view存在了就不会调用.
不要再LoadView中调用[super loadView],会影响CPU性能
dealloc: 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
在这个方法内,我们通常会把添加在控制器内的一些东西给移出.例如:KVO监听者,HUD,定时器等
//视图已经加载 做一些控件的初始化操作,比如给控件设置尺寸位置,只在加载的时候调用一次
- (void)viewDidLoad
//视图将要出现的时候
- (void)viewWillAppear:(BOOL)animated
//视图已经出现的时候会调用
- (void)viewDidAppear:(BOOL)animated
//视图将要消失的时候调用
- (void)viewWillDisappear:(BOOL)animated
//视图已经消失的时候调用
- (void)viewDidDisappear:(BOOL)animated
//控件改变位置时调用,多用于横竖屏切换。UIScrollView滚动也会触发
- (void)viewWillLayoutSubviews
- (void)viewDidLayoutSubviews
//在内存不够的情况下调用 收到low-memory时系统不会释放view,而只是释放controller的resource。
-(void)didReceiveMemoryWarning
设置title:
UIViewController *vc;
vc.title = title; // 相当于同时设置了tabBarItem.title和navigationItem.title
vc.tabBarItem.title = title; // tabBar标签上显示的文字
vc.navigationItem.title = title; // 导航栏上显示的文字
vc.hidesBottomBarWhenPushed = YES;
// 当该控件器被push显示出来的时候,自动隐藏底部tabBar;
跳转页面卡顿解决:
//把当前控制器背景颜色设为目标控制器颜色。
vc.view.backgroundColor = [UIColor redColor];
注意事项1:
//不应该这样用!!
viewController.view.bounds = CGRectMake(50, 50, 100, 200);
[viewController.view addSubview:someOtherViewController.view];
Each custom view controller object you create is responsible for managing all of the views in a single view hierarchy. In iPhone applications, the views in a view hierarchy traditionally cover the entire screen, but in iPad applications they may cover only a portion of the screen. The one-to-one correspondence between a view controller and the views in its view hierarchy is the key design consideration. You should not use multiple custom view controllers to manage different portions of the same view hierarchy. Similarly, you should not use a single custom view controller object to manage multiple screens worth of content.
一个ViewController应该且只应该管理一个view hierarchy,而通常来说一个完整的view hierarchy指的是整整占满的一个屏幕。而很多app满屏中会有各个区域分管不同的功能,一些开发者喜欢直接新建一个ViewController和一套相应的View来完成所要的功能(比如我自己=_=)。虽然十分方便,但是却面临很多风险..
最后附图: