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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操