iOS开发:父子控制器简介:
#import "ViewController.h"
#import "ScoietyViewController.h"
#import "HotViewController.h"
#import "TopLineViewController.h" /*
父子控制器:多控制器管理:导航控制器,UITabBarController
默认UITabBarController,实现这种效果,父子实战
永远只会显示一个view,把之前的view移除
UITabBarController有个专门存放子控制器view,占位视图思想,1.不用去考虑子控制器的view尺寸 2.屏幕适配也不用管理 实现:
1.添加所有子控制器:addChildViewController
2.设置对应按钮的内容,按钮内容由对应子控制器:
NSInteger count = self.titleContainView.subviews.count;
for (int i = 0; i < count; i++) {
UIButton *btn = self.titleContainView.subviews[i];
UIViewController *vc = self.childViewControllers[i];
[btn setTitle:vc.title forState:UIControlStateNormal];
}
3:添加子控制器的view:1:先移除当前添加的view 2:再添加新的view,设置frame 方法:1:可以属性定义一个currentView,来记录当前的view,也可以直接遍历子控件数组,调用数组的方法:[self.containView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];来实现view的移除操作。再添加新的view的时候,从子控制器数组根据index取出当前点击的控制器,将其view添加到父控制器的view上。
4:1:当一些业务逻辑比较复杂的时候,就将此业务逻辑交给控制器来处理,当两个view互为父子关系的时候,他们的控制器也最好为父子关系 ,当两个控制器互为父子关系后,实现push或是diss等方法的时候,在子控制器中实现点击方法,系统会首先判断子控制器能否实现,有没有当前的导航控制器或是是否是当前modal出来的控制器,如果不是,就会向其父类中查找,直到找不到父类为止 ,找到父类后,父类就会实现相应的方法(push diss例子) ,互为父子关系的时候,则其就会有一个强引用,将子控制器会被存放到子控制器数组中,子控制器和view都会被强引用。 2:makeObjectsPerformSelector,数组的方法,遍历数组每个元素去执行某个方法。
3:常用的就是从子控件数组或是从子控制器的数组中根据index取出子控件或是子控制器的,可以调用get方法取出设置的子控件或是子控件view的值去给其他赋值,或是移除currentView,再添加新的view,设置新view的frame */ @interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *titleContainView;
@property (weak, nonatomic) IBOutlet UIView *containView; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; // 1.添加所有的子控制器
[self setupAllViewController];
// 2.设置按钮的内容
[self setupTitleButton];
} // 设置按钮的内容
- (void)setupTitleButton
{
NSInteger count = self.titleContainView.subviews.count;
for (int i = ; i < count; i++) {
UIButton *btn = self.titleContainView.subviews[i];
UIViewController *vc = self.childViewControllers[i];
[btn setTitle:vc.title forState:UIControlStateNormal];
}
} // 添加所有的子控制器
- (void)setupAllViewController
{
// 社会
ScoietyViewController *scoietyVc = [[ScoietyViewController alloc] init];
scoietyVc.title = @"社会";
[self addChildViewController:scoietyVc]; // 头条
TopLineViewController *topLineVc = [[TopLineViewController alloc] init];
topLineVc.title = @"头条";
[self addChildViewController:topLineVc]; // 热点
HotViewController *hotVc = [[HotViewController alloc] init];
hotVc.title = @"热点";
[self addChildViewController:hotVc]; } // 点击标题按钮
- (IBAction)showChildVcView:(UIButton *)sender { // 移除之前控制器的view
[self.containView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
// for (UIView *vcView in self.containView.subviews) {
// [vcView removeFromSuperview];
// } // 把对应子控制器的view添加上去
UIViewController *vc = self.childViewControllers[sender.tag];
vc.view.backgroundColor = sender.backgroundColor;
vc.view.frame = self.containView.bounds;
[self.containView addSubview:vc.view];
} @end
iOS开发:父子控制器简介:的更多相关文章
- iOS开发中控制器切换方式Modal
简介 在iPhone开发中 Modal是一种常见的切换控制器的方式 默认是从屏幕底部往上弹出,直到完全盖住后面的内容为止 在iPad开发中 Modal的使用频率也是非常高的 对比iPhone开发,Mo ...
- iOS开发UIEvent事件简介
1.UIEvent简介 UIEvent是代表iOS系统中的一个事件,一个事件包含一个或多个的UITouch: UIEvent分为四类: UIEventType typedef NS_ENUM(NSIn ...
- iOS开发之控制器创建与加载(生命周期)
1.如何创建一个控制器 控制器常见的创建方式有以下几种: (1)通过storyboard创建 (2)直接创建 MJViewController *mj = [[MJViewController all ...
- iOS 开发笔记-控制器tab切换view显示
在开发过程中,我们常常会碰到一种情况就是,在一个controller里面,经常要放很多复杂的控制,最常用的就是tar切换.tar切换,原理就是在一个controller里面,显示另一个controll ...
- iOS开发 - UIViewController控制器管理
创建一个控制器 控制器常见的创建方式有下面几种 //通过storyboard创建 //直接创建 ViewController *vc = [[ViewController alloc] init]; ...
- 玩转iOS开发 - 视图控制器生命周期
视图控制器生命周期
- 【IOS开发—视图控制器】
一.UIViewController 视图控制器是UIViewController类或者其子类对象,每个视图控制器都负责管理一个视图层次结构.在UIViewController中有一个重要的UIVie ...
- iOS开发UIView.h简介
1.UICoordinateSpace不同坐标空间的坐标切换 @protocol UICoordinateSpace <NSObject> //将当前的坐标空间点转换到指定的坐标空间 - ...
- iOS开发CGImage.h简介
1.前因 由于剪切图片用到下面方法,此方法属于CGImage.h中,通过创建CGImageRef像素位图,可以通过操作存储的像素位来编辑图片. /* Create an image using the ...
随机推荐
- HDU 5371 (2015多校联合训练赛第七场1003)Hotaru's problem(manacher+二分/枚举)
pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序 ...
- js获取单选button的值
<!DOCTYPE html> <html> <body> <script type="text/javascript"> func ...
- jquery constructor(null)
<!-- jQuery = function() { --> <!-- return new jQuery.fn.F(); --> <!-- }, --> < ...
- [NowCoder]牛客网NOIP赛前集训营-提高组(第七场)
链接 A.中国式家长2 模拟题,毫无坑点 #include<bits/stdc++.h> #define REP(i,a,b) for(int i(a);i<=(b);++i) #d ...
- CSRF Failed: Referer checking failed - no Referer
postman模拟登录出了这个错误,其实看标题就知道大概是怎么回事,网上大概找了办法,也没说到位,所以干脆自己找源码了. 问题很明显就是出在 CSRF 上,理所当然去查看 CsrfViewMiddle ...
- 单元测试Assert类
Assert类主要的静态成员 1. AreEqual:方法被重载了N多次,主要功能是判断两个值是否相等:如果两个值不相等,则测试失败. 2. AreNotEqual:方法被重载了N多次,主要功能是判断 ...
- shell实例浅谈之三产生随机数七种方法
一.问题 Shell下有时须要使用随机数,在此总结产生随机数的方法.计算机产生的的仅仅是"伪随机数".不会产生绝对的随机数(是一种理想随机数).伪随机数在大量重现时也并不一定保持唯 ...
- 怎样将OpenStack部署到Hadoop
随着信息时代的快速发展,大数据技术和私有云环境都非常实用;只是,假设将两者结合在一起.企业会获得巨大的利润.虽然结合两者会让环境变得更复杂.企业仍然能够看到将 OpenStack 私有云和 Apach ...
- 不安装谷歌市场,下载谷歌市场中的APK
不安装谷歌市场,下载谷歌市场中的APK GooglePlayStore 是谷歌官方的的应用市场,有的时候还是需要从谷歌市场下载APK文件.国内的安卓手机厂商都不自带GooglePlay,甚至一些手机& ...
- 1.15 Python基础知识 - 函数
函数是可重用的程序代码段. 一.函数的声明和调用 声明格式: def 函数名([形参列表]): 函数体 调用格式: 函数名([实参列表]) 函数名:是一种标识符,命名规则为全小写字母,可以使用下划线增 ...