一、如图所示的界面,按钮One、Two、Three分别对应三个控制器的view,点击实现切换。个人感觉父子控制器的重点在于,控制器的view们之间建立了父子关系,控制器不建立的话,发生在view上面的事件,对应的view可能接收不到,控制器们建立了父子关系后,可以将事件传递给相应的控制器。

练习代码如下:

 #import "ViewController.h"
#import "OneTableViewController.h"
#import "TwoViewController.h"
#import "ThreeViewController.h" @interface ViewController ()
/** curView */
@property(nonatomic,strong) UIViewController *curVC;
/** old */
@property(nonatomic,assign) NSInteger oldIndex;
/** view */
@property(nonatomic,strong) UIView *contentView;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; // 不给按钮,只给view做动画的解决办法 -- 多用一个view将要动画的view包起来,动画添加到这个view上
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(, , self.view.bounds.size.width, self.view.bounds.size.height - )];
[self.view addSubview:contentView]; self.contentView = contentView; [self addChildViewController:[[OneTableViewController alloc] init]];
[self addChildViewController:[[TwoViewController alloc] init]];
[self addChildViewController:[[ThreeViewController alloc] init]]; } - (IBAction)btnClick:(UIButton *)sender { // 移除当前的
[self.curVC.view removeFromSuperview]; // 取出角标
NSInteger index = [sender.superview.subviews indexOfObject:sender];
// 根据角标从集合中取出相应的VC
self.curVC = self.childViewControllers[index]; self.curVC.view.frame = self.contentView.bounds;
[self.contentView addSubview:self.curVC.view]; CATransition *anim = [CATransition animation];
anim.type = @"cube";
anim.subtype = index > self.oldIndex ? kCATransitionFromRight : kCATransitionFromLeft;
anim.duration = 0.5;
[self.contentView.layer addAnimation:anim forKey:nil];
self.oldIndex = index; } @end

二、总结

  • 如果两个控制的view是父子关系(不管是直接还是间接的父子关系),那么这两个控制器也应该为父子关系
  • [a.view addSubview:b.view];
    [a addChildViewController:b];
    // 或者
    [a.view addSubview:otherView];
    [otherView addSubbiew.b.view];
    [a addChildViewController:b];
  • 获得所有的子控制器
  • @property(nonatomic,readonly) NSArray *childViewControllers;
  • 添加一个子控制器
  • //XMGOneViewController成为了self的子控制器
    //self成为了XMGOneViewController的父控制器
    [self addChildViewController:[[XMGOneViewController alloc] init]];
    // 通过addChildViewController添加的控制器都会存在于childViewControllers数组中
  • 获得父控制器
  • @property(nonatomic,readonly) UIViewController *parentViewController;
  • 将一个控制器从它的父控制器中移除
  • // 控制器a从它的父控制器中移除
    [a removeFromParentViewController];

iOS边练边学--父子控制器之自定义控制器的切换的更多相关文章

  1. iOS边练边学--父子控件之作为导航控制器的子类产生的问题以及网易新闻练习

    一.导航控制器的子类 作为导航控制器的子类,并且是导航控制器子类中的第一个,系统会默认给子控件添加EdgeInsert属性,把导航栏的宽度挤出来.但是系统只会默认修改第一个. 解决办法1:系统帮忙给第 ...

  2. iOS边练边学--Http网络再学习,简单介绍

    一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...

  3. iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

    一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码 ...

  4. 菜鸟学四轴控制器之3:数字积分法DDA实现直线插补

    上一篇的逐点比较法显然是无法画一条有倾角的直线的.因为X轴和Y轴永远都不同步,也就是像打台球一样,你打一个,我打一个,如果我进了球,我再接着打一个. 也就是说,如果直线为45度,也是没有办法画出来的, ...

  5. iOS边练边学--CALayer,非根层隐式动画,钟表练习

    一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...

  6. iOS边练边学--UIGestureRecognizer手势识别器简单介绍

    iOS 3.2之后,苹果退出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度. 一.UIGestureRecognizer UIGestureRe ...

  7. iOS边练边学--触摸事件以及能够拖拽的UIView的练习

    一.用户在使用APP的过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: 二.响应者对象 在iOS中只有继承了了UIResponder的对象才能接受并处理事件,这样的对象称之为“响应者对象 ...

  8. iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

    iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...

  9. iOS边练边学--图片的拉伸

    图片拉伸方法一: IOS 5.0以后才有的方法: - (void)viewDidLoad { [super viewDidLoad]; UIImageView *imageView = [[UIIma ...

随机推荐

  1. java GUI,贷款服务器

    本习题来自<java语言程序设计--进阶篇>第30章,网络编程的习题. 题目描述:为一个客户端编写一个服务器.客户端向服务器发送贷款信息(年利率.贷款年限和贷款总额).服务器计算月偿还额和 ...

  2. UVA 12723 Dudu, the Possum --数学期望

    题意不说了,概率和期望值要分开处理. 方法1:可以先算出到达每层的概率,然后再乘以每层的期望,每层的期望是固定的. 方法二:也可以从后往前直接推期望.为什么从后往前呢?因为第i层的时候,它可以跳到的层 ...

  3. Hibernate之Query接口的uniqueResult()方法

    如果查询返回多个值用list()方法 public void testQuery(){ Configuration config = new Configuration().configure(); ...

  4. Unity-WIKI 之 AllocationStats(内存分配)

    组件功能 allocationstats是一个简单的辅助工具,用于显示您的应用程序分配多少内存.它采用GC.GetTotalMemory来跟踪内存使用 使用方法 添加 Allocmem.cs 到场景中 ...

  5. TestLink学习五:TestLink1.9.13和JIRA6.3.6的集成

    testlink和jira的集成,一般步骤: 第1步:System-Issue Tracker Management添加JIRA的db模式.第2步:测试项目管理,“Issue Tracker Inte ...

  6. Android Studio系列教程六--Gradle多渠道打包

    Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...

  7. 程序清单 8-8 exec函数实例,a.out是程序8-9产生的可执行程序

    /* ============================================================================ Name : test.c Author ...

  8. javascript中的队列结构

    1.概念 队列和栈结构不同,栈是一种后进先出的结构,而队列是一种先进先出的结构.队列也是一种表结构,不同的是队列只能在队尾插入元素,在队首删除元素,可以将队列想象成一个在超时等待排队付钱的队伍,或者在 ...

  9. 理解SQL Server中的权限体系(下)----安全对象和权限

    原文:http://www.cnblogs.com/CareySon/archive/2012/04/12/SQL-Security-SecurableAndPermission.html 在开始阅读 ...

  10. sqlserver字段类型详解(转)

    bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型, ...