iOS边练边学--父子控制器之自定义控制器的切换

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

练习代码如下:

 1 #import "ViewController.h"
 2 #import "OneTableViewController.h"
 3 #import "TwoViewController.h"
 4 #import "ThreeViewController.h"
 5
 6 @interface ViewController ()
 7 /** curView */
 8 @property(nonatomic,strong) UIViewController *curVC;
 9 /** old */
10 @property(nonatomic,assign) NSInteger oldIndex;
11 /** view */
12 @property(nonatomic,strong) UIView *contentView;
13 @end
14
15 @implementation ViewController
16
17 - (void)viewDidLoad {
18     [super viewDidLoad];
19
20     // 不给按钮,只给view做动画的解决办法 -- 多用一个view将要动画的view包起来,动画添加到这个view上
21     UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 64, self.view.bounds.size.width, self.view.bounds.size.height - 64)];
22     [self.view addSubview:contentView];
23
24     self.contentView = contentView;
25
26     [self addChildViewController:[[OneTableViewController alloc] init]];
27     [self addChildViewController:[[TwoViewController alloc] init]];
28     [self addChildViewController:[[ThreeViewController alloc] init]];
29
30
31 }
32
33 - (IBAction)btnClick:(UIButton *)sender {
34
35     // 移除当前的
36     [self.curVC.view removeFromSuperview];
37
38     // 取出角标
39     NSInteger index = [sender.superview.subviews indexOfObject:sender];
40     // 根据角标从集合中取出相应的VC
41     self.curVC = self.childViewControllers[index];
42
43     self.curVC.view.frame = self.contentView.bounds;
44     [self.contentView addSubview:self.curVC.view];
45
46
47     CATransition *anim = [CATransition animation];
48     anim.type = @"cube";
49     anim.subtype = index > self.oldIndex ? kCATransitionFromRight : kCATransitionFromLeft;
50     anim.duration = 0.5;
51     [self.contentView.layer addAnimation:anim forKey:nil];
52     self.oldIndex = index;
53
54 }
55
56 @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];
时间: 2024-08-28 10:04:12

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

菜鸟学四轴控制器之1:插补是啥东西

之前看过运动控制芯片的手册,包括了NOVA的MCX314和PCL6045等,知道插补的概念. 但是插补到底是啥玩意,其实一直是有点疑惑的,然后就傻乎乎的去问一些专家,他们的说法是: 插补可以同时多轴输出,速度很快.然后就不知道问啥了. 基于我之前做步进电机的经验,以及测试步进电机驱动器的经验,我一般情况下都是通过单片机发一个固定脉冲来测试驱动器的性能.如果需要测试电机各种速度下的力矩特性,最多采用了S加减速曲线,在我看来,要画一个直线,那太简单了,直接X轴和Y轴同时给不同速度的脉冲不就OK了么?

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

一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层 当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘制,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示 UIView本身不具备显示的功能,是他内部的层才有显示功能 二.CALayer的基本使用 三.关于CALa

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

一.用户在使用APP的过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: 二.响应者对象 在iOS中只有继承了了UIResponder的对象才能接受并处理事件,这样的对象称之为“响应者对象” UIApplication.UIViewController.UIView都继承自UIResponder,因此他们都是响应者对象,都能够接受并处理事件 UIResponder内部提供了以下方法来处理事件 三.练习中对UIView的触摸事件进行了熟悉 四.UITouch 一根手指对应一个UITou

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

iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core Data--这里暂且不讲 一.应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示 二.应用沙盒结构分析 应用程序包:(上图中的Layer)包含了所有的资源文件和可执行文件 Do

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

一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码) 三.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题(存钱取钱的例子,多个售票员卖票的例子) 安全隐患解决的方法 --- 互斥锁(图解)

菜鸟学四轴控制器之2:逐点比较法

逐点比较法是基准脉冲插补算法中,最简单和直接的一种方式. 简单粗暴,速度快! 可以实现直线插补,圆形插补和其他的插补,比如椭圆形等. 逐点比较法,顾名思义,就是每走一步都要将加工点的瞬时坐标同规定的图形轨迹相比较,判断其偏差,然后决定下一步的走向,如果加工点走到图形外面去了,那么下一步就要向图形里面走:如果加工点在图形里面,那么下一步就要向图形外面走,以缩小偏差.这样就能得出一个非常接近规定图形的轨迹,最大偏差不超过一个脉冲当量. 所以说,一般的雕刻机应该可以满足要求吧,关键是速度也快啊,比如说

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

上一篇的逐点比较法显然是无法画一条有倾角的直线的.因为X轴和Y轴永远都不同步,也就是像打台球一样,你打一个,我打一个,如果我进了球,我再接着打一个. 也就是说,如果直线为45度,也是没有办法画出来的,只能是锯齿形状. 如何实现X和Y同时动?也就是说,如果要画一条45度的线,X和Y同时动不就行了么? 比如起点为0,0,终点为5,5,如果采用逐点比较法,则需要运动10次,如果两轴同时运动,则5步就可以实现了.实现的途径如下: 初始值为0,0,然后下一步,我们每个坐标增加5,则结果为5,5,这样会溢出

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

图片拉伸方法一: IOS 5.0以后才有的方法: 1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 UIImageView *imageView = [[UIImageView alloc] init]; 4 imageView.frame = CGRectMake(30, 30, 300, 300); 5 UIImage *image = [UIImage imageNamed:@"chat_send_press_pic"]; 6 //

iOS边练边学--tableView的批量操作

一.tableView批量操作方法一:(自定义) <1>在storyboard中添加imageView控件,用来操作当cell被选中后显示图标 <2>拖线,在自定义控件类中与imageView控件建立连接 <3>在模型类中增加一个控制imageView是否显示的数据.运用MVC思想,M变动,V会跟着变动.不要直接拿到cell修改imageView的显示状态,这样会在cell循环利用中出现混乱 <4>控制器中的代码 控制器中要实现tableView的代理方法