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. iOS开发:十六进制颜色转UIColor

    Objective-C UIColor * __nullable UIColorFromHexValue(NSUInteger hexValue) { CGFloat red = (hexValue ...

  2. 动态规划-不连续最大子序列和-打家劫舍系列-1388. 3n 块披萨

    2020-03-24 17:49:58 198. 打家劫舍 问题描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, ...

  3. [暴力枚举]Codeforces Vanya and Label

    Vanya and Label time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  4. Codeforce219C-Color Stripe

    E. Color Stripe time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  5. JSP+Servlet+C3P0+Mysql实现的苹果网上商城

    项目简介 项目来源于:https://github.com/gpengDemo/Estore 本系统基于JSP+Servlet+C3P0+Mysql.涉及技术少,易于理解,适合JavaWeb初学者学习 ...

  6. AQS源码详细解读

    AQS源码详细解读 目录 AQS源码详细解读 基础 CAS相关知识 通过标识位进行线程挂起的并发编程范式 MPSC队列的实现技巧 代码讲解 独占模式 独占模式下请求资源 独占模式下的释放资源 共享模式 ...

  7. html之样式

    HTML 样式 1. font字体 font-family 字体样式 比如:微软雅黑.Serif 字体.Sans-serif 字体.Monospace 字体.Cursive 字体.Fantasy 字体 ...

  8. 骑士cms-通读全文-代码审计

    版本号:3.5.1 下载地址:http://103.45.101.75:66/2/201412/74cms.rar 1.审计方法 通读审计 1.1查看文件结构 首先需要看看有哪些文件和文件夹,寻找名称 ...

  9. 使用FME对CAD管网数据进行过滤、聚合、中心点替换

    1.首先加载CAD数据,并暴露出需要使用到的相关字段.比如:block_number.fme_geometry.fme_color等字段. 2.对一个元素有多种类型部件的需要进行过滤,例如本次的检修井 ...

  10. coding++:高并发解决方案限流技术-使用RateLimiter实现令牌桶限流-Demo

    RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率. 通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时 ...