猫猫学iOS 之控制器view显示中view的父子关系及controller的父子关系_解决屏幕旋转不能传递事件问题

猫猫分享,必须精品

原创文章,欢迎转载。转载请注明:翟乃玉的博客

地址:http://blog.csdn.net/u013357243

一:效果

二:项目代码

这个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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 05:13:15

猫猫学iOS 之控制器view显示中view的父子关系及controller的父子关系_解决屏幕旋转不能传递事件问题的相关文章

猫猫学IOS(四)UI之半小时搞定Tom猫

话不多说 先上效果 项目源码素材下载地址: Tom猫游戏代码iOS 素材http://blog.csdn.net/u013357243/article/details/44457357 效果图 曾经风靡一时的tom猫其实制作起来那是叫一个相当的easy啊 功能全部实现,(关键是素材,没有素材的可以加我微信) 新手也可以很快的完成tom这个很拉轰的ios应用哦 做过android的我表示,android党默哀下把,那个做起来真心痛苦.... 然后呢你需要准备这些素材... 拖拽控件吧,因为这一个项

(素材_源码) 猫猫学IOS(五)UI之360等下载管理器九宫格UI

猫猫分享,必须精品 先看效果 代码学习地址: 猫猫学IOS(五)UI之360等下载管理器九宫格UI 猫猫学IOS(五)UI之360等下载管理器九宫格UI http://blog.csdn.net/u013357243/article/details/44486609 下载地址:http://download.csdn.net/detail/u013357243/8516817 ps1:有想要源码的可以加猫猫微信znycat QQ也可以:1764541256 --视频学习资料素材免费分析,哎自己一

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

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封装代码,并且系统的UINavigationController不能满足我们的需求了,所以得自定义. 首先,我们在NYTabBarViewContro

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

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 一:加入导航控制器 上一篇博客完毕了对底部的TabBar的设置,这一章我们完毕自己定义导航控制器(NYNavigationController). 为啥要做自己定义呢.由于为了更好地封装代码,而且系统的UINavigationController不能满足我们的需求了,所以得自己定义. 首先,我们在NYTabBarViewCon

猫猫学IOS(二十五)UI之触摸事件

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents iOS中的事件 在用户使用app过程中,会产生各种各样的事件;iOS中的事件可以分为3大类型: 响应者对象–UIResponder 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象" UIApplication.UIViewController.UI

猫猫学IOS(十三)UI之UITableView学习(下)汽车名牌带右侧索引

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44727225 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 代码 ViewController //ps:新建iOS交流学习群:304570962 可以加猫猫QQ:1764541256 或则微信znycat 让我们一起努力学习吧. 原文:http://blog.csdn.net/u0133

猫猫学iOS(四十四)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一下操作. 代码: 话不多说,先把所有代码放上来.能看懂就不用看别的了.(这么详细的注释,看不懂才怪..) 弹出view:NYBuyControlle

猫猫学IOS(二十八)UI之Quartz2D简单介绍

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents iOS开发UI篇-Quartz2D简单介绍 什么是Quartz2D Quartz 2D是?个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 Quartz2D在iOS开发中的

猫猫学iOS之ipad开发qq空间项目横竖屏幕适配

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果图 先看效果 二:结构图 如图所示: 其中用到了UIView+extension分类 Masonry第三方框架做子控制器的适配 NYHomeViewController对应主页也就是全部 NYDock是左边的菜单栏 放置各个选项卡等按钮功能区域 NYIconView头像 NYTabBar选项卡 NYToolBar最下面的功能区 NYTabBarButto