iOS开发技巧之:父子控制器
来源:互联网 发布:pxe网络装机 编辑:程序博客网 时间:2024/05/16 11:20
父子控制器
在 iOS 开发中我们经常用到的两大父子控制器分别是:UINavigationController 和 UITabBarController。但是经常也会为了实现一些需求,自己去写一个类似于 UITabBarController 的功能,也就是点击按钮切换控制器,如图:
功能都类似于 UITabBarController,点击切换控制器。只不过将 UITabBarController 底部的按钮,移到顶部,或者其他位置去了。这时候就得自己去实现一个父子控制器。
实现
完成界面如图所示:
首先新建一个项目,创建一个父控制器,然后创建三个子控制器,如图:
对父控制器上面的三个菜单按钮分别添加 tag 来进行区分,拖一个点击事件,都跳转到同一个方法。然后在父控制器里面,进行子控制器的添加和切换操作:
@interface ViewController ()@property (nonatomic, weak) UIViewController *currentVC;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // 添加子控制器 [self addChildViewController:[[OneViewController alloc] init]]; [self addChildViewController:[[TowViewController alloc] init]]; [self addChildViewController:[[ThreeViewController alloc] init]];}- (IBAction)clickMenu:(UIButton *)btn { // 取出选中的这个控制器 UIViewController *vc = self.childViewControllers[btn.tag]; // 设置尺寸位置 vc.view.frame = CGRectMake(0, 70, self.view.frame.size.width, self.view.frame.size.height - 50); // 移除掉当前显示的控制器的view(移除的是view,而不是控制器) [self.currentVC.view removeFromSuperview]; // 把选中的控制器view显示到界面上 [self.view addSubview:vc.view]; self.currentVC = vc;}
其中,currentVC 属性用来记录当前正在显示的 view。如果进行切换操作,要把 currentVC 从父类的 view 中移除掉。
不移除的后果是:界面上会显示出所有的 view,只不过你只能看到最上面那个。会增加系统的开销。
整体还是非常简单的,在 UIViewController 里面,有一个数组用来专门存放子控制器,可以方便进行管理。当然也可以自己在父控制器里面建立一个数组来对子控制器进行管理。不过这样会产生一些问题,稍后会说到。
我 Demo 中的例子非常简单。实际开发中,子控制器的 View 可能是 UITableView 或者其他更为复杂的界面布局,这个时候使用父子控制器显得尤为重要。这样子控制器可以对自己的 view 进行管理,不必什么操作都放到父控制器中,也符合高内聚,低耦合
的开发原则。
结论
使用系统带的 childViewControllers 数组有很多好处。
1、当父控制器有一些重大的事件发生,可以通知到自控制器。比如:屏幕旋转等。
2、如果程序是一个基于 UINavigationController 的逻辑,那么子控制器可能会做以下调用 self.navigationController
。如果不把子控制器添加到 childViewControllers 数组中,子控制器拿到的self.navigationController
为空。
结论:不要自己创建数组来管理子控制器,用 UIViewController 自带的 childViewControllers 数组可以避免掉很多不必要的麻烦。
扩展
可以在整体布局中嵌套一个 ScrollView,使子控制器可以进行滑动切换,实现类似于网易新闻的效果。
也可以在切换 view 时加入动画。
- iOS开发技巧之:父子控制器
- IOS开发UI基础:控制器父子关系
- 父子控制器的开发准则
- iOS 开发之 导航控制器
- iOS 控制器父子关系的建立原则
- 父子控制器
- 父子控制器
- 父子控制器
- 父子控制器
- 父子控制器
- 父子控制器
- 父子控制器
- iOS开发之使用addChildViewController:给控制器添加子控制器
- iOS开发之视图控制器(UIViewController)
- IOS开发之视图控制器UIViewControl…
- IOS开发之导航控制器UINavigationC…
- ios开发之视图控制器(UIViewController)-- 详解
- iOS开发之控制器的创建
- Git 版本控制器使用指南-II(远程代码控制)
- scrapy+beautifulsoup+mongo数据库简单爬虫——利用搜索关键词爬取百度百科城市地理信息
- 前端学习
- Ext.Window点击右上角关闭(X按钮)添加监听事件
- 使用VideoView播放视频,锁屏暂停播放之后,过一会自动播放,而且可以通过滑动屏幕调节音量。。。
- iOS开发技巧之:父子控制器
- jQuery获取select元素option的文本值和value值
- BIOS学习笔记
- Ubuntu14.04安装QQ
- android AsyncTask介绍
- c# 泛型
- map转Json、String转Map、Map的key转List、map的value转List、JSONArray转List、Json转Map
- c/c++的一些小区别
- Android自定义View【实战教程】1⃣️----attrs.xml详解