IOS5.0中UIControllerView新方法的使用

2024-08-21 07:18

本文主要是介绍IOS5.0中UIControllerView新方法的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  
在iOS 5.0以前,我们在一个 UIViewController中这样组织相关的 UIView

在以前,一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super view中去掉。

在iOS 5.0及以后,iOS为 UIViewController类添加了新的属性和方法:

@property(nonatomic,readonly) NSArray *childViewControllers


- (void)addChildViewController:(UIViewController *)childController

- (void) removeFromParentViewController

- (void)transitionFromViewController::::::

- (void)willMoveToParentViewController:(UIViewController *)parent

- (void)didMoveToParentViewController:(UIViewController *)parent


这样,就能够将一个页面中的 UIViewController控制起来,而不是混乱的共用一个 UIViewController
,最重要的是,编程习惯的革命: 降低了功能的耦合度!

概念:

[父视图控制器 addChildViewController:子视图控制器];


在此, 图控制器A添加了另一个 图控制器B,那么A充当父视图控制器,B充当子视图控制器。父视图控制器充当了视图控制器容器的角色。

addChildViewController方法:

- (void)addChildViewController:(UIViewController *)childController

向视图控制器容器中添加子视图控制器


childController:子视图控制器


当要添加的子视图控制器已经包含在视图控制器容器中,那么,相当于先从父视图控制器中删除,然后重新添加到父视图控制器中。


removeFromParentViewController 方法

- (void)removeFromParentViewController

从父视图控制器中删除。


transitionFromViewController 方法

- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion


交换两个子视图控制器的位置(由于添加的顺序不同,所以子试图控制器在父视图控制器中存在层次关系)


fromViewController:当前显示的子试图控制器,将被替换为非显示状态

toViewController:将要显示的子视图控制器

duration:交换动画持续的时间,单位秒

options:动画的方式

animations:动画Block

completion:完成后执行的Block


willMoveToParentViewController 方法

- (void)willMoveToParentViewController:(UIViewController *)parent

当一个视图控制器从视图控制器容器中被添加或者被删除之前,该方法被调用


parent:父视图控制器,如果没有父视图控制器,将为nil


注意点:

1.当我们向我们的视图控制器容器中调用removeFromParentViewController方法时,必须要先调用该方法,且parent参数为nil:

[将要删除的视图控制器 willMoveToParentViewController:nil];

2.当我们调用addChildViewController方法时,在添加子视图控制器之前将自动调用该方法。所以,就不需要我们显示调用了。


didMoveToParentViewController 方法

- (void)didMoveToParentViewController:(UIViewController *)parent

当从一个视图控制容器中添加或者移除viewController后,该方法被调用。

parent:父视图控制器,如果没有父视图控制器,将为nil


当我们向我们的视图控制器容器(就是父视图控制器,它调用addChildViewController方法加入子视图控制器,它就成为了视图控制器的容器)中添加(或者删除)子视图控制器后,必须调用该方法,告诉iOS,已经完成添加(或删除)子控制器的操作。


removeFromParentViewController 方法会自动调用了该方法,所以,删除子控制器后,不需要在显示的调用该方法了。

其实,这几个方法中的API说明,看的还懂。

最后,

关于willMoveToParentViewController方法和didMoveToParentViewController方法的使用


1.这两个方法用在子试图控制器交换的时候调用!即调用 transitionFromViewController 方法时,调用。

2.当调用 willMoveToParentViewController 方法或 didMoveToParentViewController 方法时,要注意他们的参数使用:
当某个子视图控制器将从父视图控制器中删除时,parent参数为nil。
即:[ 将被删除的子试图控制器  willMoveToParentViewController: nil];
当某个子试图控制器将加入到父视图控制器时,parent参数为父视图控制器。
即:[将被加入的子视图控制器  didMoveToParentViewController: 父视图控制器];

3.无需调用 [ 子视图控制器   willMoveToParentViewController : 父视图控制器 ] 方法。因为我们调用[ 父视图控制器  addChildViewController: 子视图控制器]时,已经默认调用了。
只需要在 transitionFromViewController方法后,调用[ 子视图控制器 didMoveToParentViewController: 父视图控制器];

4.无需调用 [ 子视图控制器  didMoveToParentViewController : 父视图控制器 ]方法。因为我们调用
[ 子视图控制器  removeFromParentViewController]时,已经默认调用了。
只需要在 transitionFromViewController 方法之前调用:[ 子视图控制器  willMoveToParentViewController: nil]。

例子:
创建单视图项目,然后添加两个继承自UIViewController的类,命名为 firseViewController和 secondViewController,并分别设置背景色为灰色和红色,
在主视图的代码如下:

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController

@property (nonatomic, weak) UIView *nav;

@property (nonatomic, weak) UILabel *navTitle;

@property (nonatomic, weak) UIView *contentView;

@property (nonatomic, strong) UIViewController *currentController;


@end


#import "ViewController.h"

#import "firseViewController.h"

#import "secondViewController.h"

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad

{

    [super viewDidLoad];

    UIView *vBar = [[UIView alloc] initWithFrame:CGRectMake(-1, -1, self.view.frame.size.width+2, 44)];

    vBar.layer.shadowColor = [UIColor blackColor].CGColor;

    vBar.layer.shadowOffset = CGSizeMake(0, 1);

    vBar.layer.shadowOpacity = 1;

    vBar.layer.shadowRadius = 4;

    vBar.layer.borderWidth = 1;

    vBar.layer.borderColor = (__bridge CGColorRef)([[UIColor blackColor] colorWithAlphaComponent:0.4]);

    //    vBar.borderWidth = 1;

    //    vBar.borderColor = [[UIColor blackColor] colorWithAlphaComponent:0.4];

    vBar.backgroundColor  = [[UIColor blackColor] colorWithAlphaComponent:0.05];

    self.nav = vBar;

    

    float x  = self.view.frame.size.width/3;

    UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(x, 0, x, 44)];

    lb.font = [UIFont boldSystemFontOfSize:18.0f];

    lb.textAlignment = NSTextAlignmentCenter;

    lb.textColor = [UIColor whiteColor];

    lb.text = @"make";

    lb.backgroundColor = [UIColor clearColor];

    self.navTitle = lb;

    

    UIView *cView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, self.view.frame.size.width, 400)];

    cView.backgroundColor = [UIColor greenColor];

    cView.clipsToBounds = YES;

    self.contentView = cView;

    

    [vBar addSubview:lb];

    [self.view addSubview:vBar];

    [self.view addSubview:cView];

    

    UIButton *pbtn  = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    pbtn.tag = 0;

    [pbtn setTitle:@"changCurrentView" forState:UIControlStateNormal];

    [pbtn addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];

    [pbtn setFrame: CGRectMake(80, 430, 200, 50)];

    [self.view addSubview:pbtn];

    

    firseViewController *view = [[firseViewController alloc] init];

    view.baseView = self;

    self.currentController = view;

    [self.contentView addSubview:view.view];

    [self addChildViewController:view];

// Do any additional setup after loading the view, typically from a nib.

}


- (void)press:(UIButton *)sender

{

    firseViewController *first  =[[firseViewController alloc] init];

    secondViewController *second = [[secondViewController alloc] init];

    int i = sender.tag;

    UIViewController *toControl;


    switch (i) {

        case 0:

            //second.baseView = self;

            [self addChildViewController:second];

            toControl = second;

            second.baseView.navTitle.text = @"Second";

            sender.tag = 1;

            break;

        case 1:

            //first.baseView = self;

            [self addChildViewController:first];

            toControl = first;

            sender.tag = 0;

            first.baseView.navTitle.text = @"First";


            break;

        default:

            break;

    }

    //将要把视图从视图控制器中移除

    [self.currentController willMoveToParentViewController:nil];

    //交换两个视图控制器的位置

    [self transitionFromViewController:self.currentController toViewController:toControl duration:0.3 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{

        

    } completion:^(BOOL finished) {

        [self.currentController removeFromParentViewController];

        [toControl didMoveToParentViewController:self];

        self.currentController = toControl;

    }];

}


- (void)willMoveToParentViewController:(UIViewController *)parent

{

    NSLog(@"willMoveToParentViewController:%@",parent);

}


- (void)didMoveToParentViewController:(UIViewController *)parent

{

    NSLog(@"didMoveToParentViewController:%@",parent);


}

- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end

这篇关于IOS5.0中UIControllerView新方法的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092482

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互