AJ学IOS 之控制器view显示中view的父子关系及controller的父子关系_解决屏幕旋转不能传递事件问题
AJ分享,必须精品
一:效果
二:项目代码
这个Demo用的几个控制器分别画了不通的xib,随便拖拽了几个空间,主要是几个按钮的切换,主要代码展示下:
//
//  NYViewController.m
//  控制器的view的显示
//
//  Created by apple on 14-10-10.
//  Copyright (c) 2014年 heima. All rights reserved.
//
#import "NYViewController.h"
#import "NYTestViewController.h"
#import "NYOneViewController.h"
#import "NYTwoViewController.h"
#import "NYThreeViewController.h"
@interface NYViewController ()
- (IBAction)vc1;
- (IBAction)vc2;
- (IBAction)vc3;
@property (nonatomic, strong) NYTestViewController *test;
@property (nonatomic, strong) NYOneViewController *one;
@property (nonatomic, strong) NYTwoViewController *two;
@property (nonatomic, strong) NYThreeViewController *three;
@end
@implementation NYViewController
- (NYOneViewController *)one
{
    if (!_one) {
        self.one = [[NYOneViewController alloc] init];
        self.one.view.frame = CGRectMake(10, 70, 300, 300);
    }
    return _one;
}
- (NYTwoViewController *)two
{
    if (!_two) {
        self.two = [[NYTwoViewController alloc] init];
        self.two.view.frame = CGRectMake(10, 70, 300, 300);
    }
    return _two;
}
- (NYThreeViewController *)three
{
    if (!_three) {
        self.three = [[NYThreeViewController alloc] init];
        self.three.view.frame = CGRectMake(10, 70, 300, 300);
    }
    return _three;
}
/**
 * 即将旋转到某个屏幕时调用
 */
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    NSLog(@"NYViewController---willRotateToInterfaceOrientation");
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    NSLog(@"NYViewController---didRotateFromInterfaceOrientation");
}
- (void)viewDidLoad
{
    [super viewDidLoad];
//    NYTestViewController *test = [[NYTestViewController alloc] init];
//    test.view.frame = CGRectMake(100, 100, 200, 300);
//    test.view.backgroundColor = [UIColor redColor];
//    [self.view addSubview:test.view];
//    self.test = test;
    // 如果发现:控制器的view还在,但是view上面的数据不显示,极大可能是因为:控制器被提前销毁了
    // 1.一个控制器的view是可以随意调整尺寸和位置的
    // 2.一个控制器的view是可以随意添加到其他view中
    // 3.如果将一个控制器的view,添加到其他view中显示,那么要想办法保证控制器不被销毁
    // 4.原则:只要view在,view所在的控制器必须得在,这样才能保证view内部的数据和业务逻辑正常
}
- (IBAction)vc1 {
    [self.two.view removeFromSuperview];
    [self.three.view removeFromSuperview];
    [self.view addSubview:self.one.view];
}
- (IBAction)vc2 {
    [self.one.view removeFromSuperview];
    [self.three.view removeFromSuperview];
    [self.view addSubview:self.two.view];
}
- (IBAction)vc3 {
    [self.two.view removeFromSuperview];
    [self.one.view removeFromSuperview];
    [self.view addSubview:self.three.view];
}
@end
三:旋转事件问题
这样貌似就可以完成大多数的需求了,但是有时候我们会发现一些问题,比如当屏幕旋转的时候事件无法传递
/**
 * 即将旋转到某个屏幕时调用
 */
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    NSLog(@"NYViewController---willRotateToInterfaceOrientation");
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    NSLog(@"NYViewController---didRotateFromInterfaceOrientation");
}如果我们将这两个方法写到one two three这三个控制器中,相应的在屏幕旋转的时候,只有主控制器打印了这个方法,然而其他的控制器中并没有,这里的原因就是他们的控制器是平级的,虽然view是父子关系,解决办法就是设置controller的父子关系。
四:解决代码
当控制器的view互为父子关系,那么控制器最好也互为父子关系
  NYOneViewController *one = [[NYOneViewController alloc]init];让one控制器成为当前self(HWViewController)的子控制器
    [self addChildViewController:one];通过关addChildViewController添加一个子控制器,那么这个控制器就会被放到childViewControllers数组中 
  只要self在,childViewControllers数组就在数组里面的子控制器就在
//
//  NYViewController.m
//  控制器的view的显示
//
//  Created by apple on 14-10-10.
//  Copyright (c) 2014年 heima. All rights reserved.
//
#import "NYViewController.h"
#import "NYTestViewController.h"
#import "NYOneViewController.h"
#import "NYTwoViewController.h"
#import "NYThreeViewController.h"
@interface NYViewController ()
- (IBAction)vc1;
- (IBAction)vc2;
- (IBAction)vc3;
@property (nonatomic, strong) NYTestViewController *test;
@end
@implementation NYViewController
/**
 * 即将旋转到某个屏幕时调用
 */
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    NSLog(@"NYViewController---willRotateToInterfaceOrientation");
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    NSLog(@"NYViewController---didRotateFromInterfaceOrientation");
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    //当控制器的view互为父子关系,那么控制器最好也互为父子关系
    NYOneViewController *one = [[NYOneViewController alloc]init];
    //让one控制器成为当前self(HWViewController)的子控制器
    [self addChildViewController:one];
    //通过关addChildViewController添加一个子控制器,那么这个控制器就会被放到childViewControllers数组中
    //只要self在,childViewControllers数组就在数组里面的子控制器就在
    NYTwoViewController *two = [[NYTwoViewController alloc]init];
    [self addChildViewController:two];
    NYThreeViewController *three = [[NYThreeViewController alloc]init];
    [self addChildViewController:three];
}
- (IBAction)vc1 {
    NYOneViewController *one = self.childViewControllers[0];
    NYTwoViewController *two = self.childViewControllers[1];
    NYThreeViewController *three = self.childViewControllers[2];
    [two.view removeFromSuperview];
    [three.view removeFromSuperview];
    [self.view addSubview:one.view];
}
- (IBAction)vc2 {
    NYOneViewController *one = self.childViewControllers[0];
    NYTwoViewController *two = self.childViewControllers[1];
    NYThreeViewController *three = self.childViewControllers[2];
    [one.view removeFromSuperview];
    [three.view removeFromSuperview];
    [self.view addSubview:two.view];
}
- (IBAction)vc3 {
    NYOneViewController *one = self.childViewControllers[0];
    NYTwoViewController *two = self.childViewControllers[1];
    NYThreeViewController *three = self.childViewControllers[2];
    [two.view removeFromSuperview];
    [one.view removeFromSuperview];
    [self.view addSubview:three.view];
}
@end
AJ学IOS 之控制器view显示中view的父子关系及controller的父子关系_解决屏幕旋转不能传递事件问题的更多相关文章
- AJ学IOS 之微博项目实战(3)微博主框架-UIImage防止iOS7之后自动渲染_定义分类
		AJ分享,必须精品 一:效果对比 当我们设置tabBarController的tabBarItem.image的时候,默认情况下会出现图片变成蓝色的效果,这是因为ios7之后会对图片自动渲染成蓝色 代 ... 
- AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController
		AJ分享,必须精品 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封 ... 
- AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配
		AJ分享,必须精品 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一 ... 
- AJ学IOS(28)UI之Quartz2D简单介绍
		AJ分享,必须精品 iOS开发UI篇—Quartz2D简单介绍 什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : ... 
- AJ学IOS(25)UI之触摸事件
		AJ分享,必须精品 iOS中的事件 在用户使用app过程中,会产生各种各样的事件;iOS中的事件可以分为3大类型: 响应者对象–UIResponder 在iOS中不是任何对象都能处理事件,只有继承了U ... 
- AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引
		AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ... 
- AJ学IOS(09)UI之UIScrollView代理触摸实现_图片缩放
		AJ分享,必须精品 先看效果 代码 // // NYViewController.m // 05-放大缩小图片UIScrollView // // Created by apple on 15-3-2 ... 
- AJ学IOS  之ipad开发qq空间项目横竖屏幕适配
		AJ分享,必须精品 一:效果图 先看效果 二:结构图 如图所示: 其中用到了UIView+extension分类 Masonry第三方框架做子控制器的适配 NYHomeViewController对应 ... 
- AJ学IOS(31)UI之Quartz2D图形上下文栈
		AJ分享,必须精品 首先,前面博客说过.qurza2d的上下文中有绘图信息和绘图的属性. 但是他是怎么绘制到上下午中的呢? 我们画图时候一半会用这三个步骤: (1)获取上下文 (2)绘图 (3)渲染 ... 
随机推荐
- Django-jwt token生成源码分析
			一. 认证的发展历程简介 这里真的很简单的提一下认证的发展历程.以前大都是采用cookie.session的形式来进行客户端的认证,带来的结果就是在数据库上大量存储session导致数据库压力增大,大 ... 
- hdu3367最大伪森林(并查集)
			题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3367/ 题目要求一个连通图的最大伪森林,伪森林是一个最多有一个回路的图.我们只要用Kruskal最大生成树的策略 ... 
- 洛谷1514 引水入域 dp+记忆化搜索
			题目链接:https://www.luogu.com.cn/problem/P1514 题意大致是:给定一个(n,m)的数值矩阵,可以在第一行建造水库,如果一个格子周围的某格子值小于它,那水就可以流到 ... 
- 用c写的简单的日历(学习模块划分)
			简单日历  主要目的是学习函数模块划分,成品大概是这样,加了一些花里胡哨的东西(/▽\)  分三个模块,主函数.c 显示.c 计算.c 与.h 文件 有两种实现方式,区别在于是否以数组在模块之间传 ... 
- MongoDB操作符之$elemMatch
			问题 如果MongoDB 数据库集合中仅存在一条记录 { "_id" : ObjectId("5e6b4ef546b5f44e5c5b276d"), " ... 
- MATLAB plot 画图大全
			距离上一次打开Matlab已经过去了半年多,再次上手,画图时诸多不熟悉,促使我写下这篇blog,自己以后可以快速查看,也分享给大家~ 二维线图 plot plot(X1,Y1,LineSpec1,. ... 
- arcgis server建完站点之后修改默认6080端口号
			1.首先找到arcgis server的安装路径,找到server.xml文件,修改其中一处的6080端口为你想更改的端口号,例如8888.具体操作如下图所示: 默认的安装路径为:D:\Program ... 
- coding++:thymelef 模板报错 the entity name must immediately follow the '&' in the entity reference
			thymelef模板里面是不能实用&符号的 要用&转义符代替,官网也有文档说明可以用官方的通配符代替, 官方文档 http://www.thymeleaf.org/doc/tutori ... 
- coding++:快速构建 kindeditor 富文本编辑器(一)
			此案例 demo 为 SpringBoot 开发 1.官网下载相关资源包:http://kindeditor.net/down.php 2.编写页面(引入相关JS) <!DOCTYPE html ... 
- Springboot使用自定义注解实现简单参数加密解密(注解+HandlerMethodArgumentResolver)
			前言 我黄汉三又回来了,快半年没更新博客了,这半年来的经历实属不易,疫情当头,本人实习的公司没有跟员工共患难, 直接辞掉了很多人.作为一个实习生,本人也被无情开除了.所以本人又得重新准备找工作了. 算 ... 
