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的父子关系_解决屏幕旋转不能传递事件问题的更多相关文章

  1. AJ学IOS 之微博项目实战(3)微博主框架-UIImage防止iOS7之后自动渲染_定义分类

    AJ分享,必须精品 一:效果对比 当我们设置tabBarController的tabBarItem.image的时候,默认情况下会出现图片变成蓝色的效果,这是因为ios7之后会对图片自动渲染成蓝色 代 ...

  2. AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController

    AJ分享,必须精品 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封 ...

  3. AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配

    AJ分享,必须精品 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一 ...

  4. AJ学IOS(28)UI之Quartz2D简单介绍

    AJ分享,必须精品 iOS开发UI篇—Quartz2D简单介绍 什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : ...

  5. AJ学IOS(25)UI之触摸事件

    AJ分享,必须精品 iOS中的事件 在用户使用app过程中,会产生各种各样的事件;iOS中的事件可以分为3大类型: 响应者对象–UIResponder 在iOS中不是任何对象都能处理事件,只有继承了U ...

  6. AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引

    AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...

  7. AJ学IOS(09)UI之UIScrollView代理触摸实现_图片缩放

    AJ分享,必须精品 先看效果 代码 // // NYViewController.m // 05-放大缩小图片UIScrollView // // Created by apple on 15-3-2 ...

  8. AJ学IOS 之ipad开发qq空间项目横竖屏幕适配

    AJ分享,必须精品 一:效果图 先看效果 二:结构图 如图所示: 其中用到了UIView+extension分类 Masonry第三方框架做子控制器的适配 NYHomeViewController对应 ...

  9. AJ学IOS(31)UI之Quartz2D图形上下文栈

    AJ分享,必须精品 首先,前面博客说过.qurza2d的上下文中有绘图信息和绘图的属性. 但是他是怎么绘制到上下午中的呢? 我们画图时候一半会用这三个步骤: (1)获取上下文 (2)绘图 (3)渲染 ...

随机推荐

  1. 【转】在Eclipse下,出现“找不到或无法加载主类 ”的问题的解决方式

    实际上是第一次碰到这个问题,之前从来没有遇见过,于是乎就开始找“度娘”帮忙,一搜发现有很多的程序猿都遇到这个问题.网上大部分的解决方案都是说“环境变量”配置有错误,当然这确实是引发“找不到或无法加载主 ...

  2. Drawing Simple Polygon(Create Simple Polygon from unordered points by angle sorting)

    Keywords: 极角排序, Simple Polygon Generation Given set of points in the plane, your task is to draw a p ...

  3. ThreadPoolTaskExecutor 中 corePoolSize vs. maxPoolSize

    1. 概览 Spring中的 ThreadPoolTaskExecutor 是一个 JavaBean ,提供围绕java.util.concurrent.ThreadPoolExecutor 的抽象实 ...

  4. 李宏毅老师机器学习课程笔记_ML Lecture 2: Where does the error come from?

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  5. 解决 Mac Android Studio Gradle Sync 慢的问题

    1.启动Android Studio 2.从项目的 gradle/wrapper/gradle-wrapper.properties 目录中找到 distributionUrl 这个字段,查看后面对应 ...

  6. Jupyter Notebook自动补全

    大多数程序员都非常熟悉不同的自动补全工具.然而,我注意到许多数据科学家还没有使用它.如果你是他们中的一员,是时候开始使用这个提高效率的工具了 什么是自动补全? 它是你的编程环境提供的一种功能,用于完成 ...

  7. python中面向对象&装饰器

    类的定义 基本形式: class ClassName(object): Statement 1.class定义类的关键字 2.ClassName类名,类名的每个单词的首字母大写. 3.object是父 ...

  8. iOS 第三方库

    网络 AFNetworking HTTP网络库 Reachability 网络监测 UI.布局 Masonry AutoLayout SnapKit AutoLayout Swift TOWebVie ...

  9. Python turtle库的应用——蛇

    turtle库介绍 1.Turtle中的turtle.setup()函数用于启动一个图形窗口,它有四个参数 turtle.setup(width, height, startx, starty) 分别 ...

  10. MATLAB——颜色梯度显示

    一.colormap函数 figure surf(peaks) k=; mycolor=spring(k); colormap(mycolor); spring是颜色的分类.spring(k)生成k个 ...