如果只是添加View,那么控制器要控制的东西很多会累死,所以得添加控制器
一、存在的问题分析
1.控制器已经死了,但是控制器的view还在
1> 点击控制器view内部的按钮、开关,直接EXEC_BAD_ACCESS错误(野指针错误,坏内存访问)
2> 一拖拽tableView,tableView上面显示的数据突然消失了
2.叠加了很多不必要的view
3.控制器创建得比较频繁
二、解决方案
1.保证控制器只创建一次,而且不让它马上死
2.保证控制器和控制器的view同在
三、优化
1、将创建好的控制器添加到数组中,通过数组进行操作
2、添加一个当前显示View属性,每次显示一个View前,先移除之前显示View
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
1.屏幕的旋转事件,首先会传递给窗口的根控制器(window.rootViewController)
2.窗口的根控制器又会将屏幕的旋转事件,传递给它的子控制器
3.子控制器又会将屏幕的旋转事件,传递给它自己的子控制器
4.以此类推,所有的子控制器都能监听到屏幕的旋转事件
通过addChildViewController:添加的控制器,就会成为子控制器,会被自动添加到childViewControllers数组中
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator(id<UIViewControllerTransitionCoordinator>)coordinator
** 父子控制器的开发准则**
1.如果2个控制器的view是父子关系,那么这2个控制器也应该是父子关系,系统一些事件是通过这种关系传递的
2.代码表示形式
` [vc0.view addSubview:vc1.view]`;
` [vc0 addChildViewController:vc1]`;
或者
`[vc0.view addSubview:redView]`;
` [redView addSubview:yellowView]`;
`[yellowView addSubview:vc1.view]`;
`[vc0 addChildViewController:vc1]`;
Modal
:: autoresizingMask
image.png
要想modal 和 push 必须成为父子控制器 , 会 顺着响应者链条向上找父控制器UInavigationController 和 UItabBarController 控制器都是如此
[self.navigationController pushViewController:green animated:YES];
self.tabBarController
~
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
NSLog(@"%s", func);
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
~
指示器
image.png
把控制器添加到UIScrollView
image.png
优化后的
image.png image.png
成为子控制器后
网友评论