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 ...
随机推荐
- 爬虫爬数据时,post数据乱码解决的方法
近期在写一个爬虫,目标站点是:http://zx.bjmemc.com.cn/.可能是为了防止被爬取数据,它给自身数据加了密. 用谷歌自带的抓包工具也不能捕获到数据. 于是下了Fiddler. ...
- 混合式框架-AngularJS
简单介绍 AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门非常好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了.所以我做了一些工作(你也能够认 ...
- Java总结之线程
[线程的基本概念] 线程是一个程序内部的顺序控制流. 线程和进程的差别: 每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销. 线程能够看成是轻量级的进程,同一类线程 ...
- 兔子--百度地图所需的jar+so下载地址
百度地图所需的jar+so下载地址:http://download.csdn.net/detail/u013425527/8265569
- .NET Entity Framework入门操作
Entity Framework是微软借鉴ORM思想开发自己的一个ORM框架. ORM就是将数据库表与实体对象(相当于三层中的Model类)相互映射的一种思想. 最大的优点就是非常方便的跨数据库平台. ...
- vue中v-for的用法以及参数的作用
<template> <div> <div class="content clearfix" v-on:click="goorderingD ...
- ArcGIS小技巧——多图层情况下交互显示效果
在使用ArcMap处理数据的过程中,通常需要对比不同图层之间的差异.或者查看影像配准情况,这时我通常会怀念ENVI中的强大的拉幕显示.闪烁.亮度和透明度显示工具...... 直到有一天,闲着没事干捣鼓 ...
- [React & Testing] Simulate Event testing
Here we want to test a toggle button component, when the button was click, state should change, styl ...
- Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)
Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...
- Vue 自定义全局消息框组件
消息弹框组件,默认3秒后自动关闭,可设置info/success/warning/error类型 效果图: 文件目录: Message.vue <template> <transit ...