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 ...
随机推荐
- 亚马逊AWS的route53的收费,月费最低 0.9 USD
亚马逊AWS的route53的收费Amazon Route 53 定价 https://aws.amazon.com/cn/route53/pricing/ 一文中,对于一些术语的解释第一项收费--域 ...
- Codefroces 784 愚人节题目(部分)
A. Numbers Joke time limit per test 2 seconds memory limit per test 64 megabytes input standard inpu ...
- JS 原型模式创建对象
例子: class Test { constructor(val) { this.val = val } walk() { console.log(this) console.log('walk') ...
- BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)
Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M ...
- C语言之函数指针、回调函数的使用
一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...
- 解决ListCtrl控件第一列文字不能居中显示的问题/修改网格线
把CListCtrl设置为Report风格,但是插入第一列的时候(InsertColumn)的时候会发现文字不能居中.即使使用了LVCFMT_CENTER,其他列都可以正常居中,但第一列仍然靠左显示. ...
- 洛谷——P1781 宇宙总统
https://www.luogu.org/problem/show?pid=1781 题目背景 宇宙总统竞选 题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人 ...
- actionbar-displayOptions 属性分析
displayOptions 这个属性主要是控制这actionbar 上返回按钮.标题等的显示.它作为 actionBarStyle 的一个item,如下 <style name="A ...
- php图像处理(thinkphp框架有相对强大的图像处理功能)
php图像处理(thinkphp框架有相对强大的图像处理功能) 一.总结 1.php处理图像:php处理图像需要安装外库(gd库) 2.gd库函数可以非常完美的操作图像:安装好库之后,这个库里面的函数 ...
- elasticsearch节点间通信的基础transport
在前一篇中我们分析了cluster的一些元素.接下来的章节会对cluster的运作机制做详细分析.本节先分析一些transport,它是cluster间通信的基础.它有两种实现,一种是基于netty实 ...