beginAppearanceTransition
- (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
- (void)endAppearanceTransition __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
今天看别人代码,用到这两个函数,这两个函数的是成对出现的,基本用法为
[self beginAppearanceTransition:YES animated:NO];//调用viewWillAppear
[self endAppearanceTransition];//调用viewDidAppear
[self beginAppearanceTransition:NO animated:NO];//调用viewWillDisappear
下面的解释方法来自于:http://www.cnblogs.com/yuyu-2012/p/4942059.html
在iOS 5.0及以后,iOS为UIViewController类添加了新的属性和方法:
|
1
2
3
4
5
6
|
@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充当子视图控制器。父视图控制器充当了视图控制器容器的角色。
1、addChildViewController方法:
|
1
|
- (void)addChildViewController:(UIViewController *)childController |
向视图控制器容器中添加子视图控制器
childController:子视图控制器
当要添加的子视图控制器已经包含在视图控制器容器中,那么,相当于先从父视图控制器中删除,然后重新添加到父视图控制器中。
2、removeFromParentViewController 方法
|
1
|
- (void)removeFromParentViewController |
从父视图控制器中删除。
3、transitionFromViewController 方法
|
1
|
- (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
4、willMoveToParentViewController 方法
|
1
|
- (void)willMoveToParentViewController:(UIViewController *)parent |
当一个视图控制器从视图控制器容器中被添加或者被删除之前,该方法被调用parent:父视图控制器,如果没有父视图控制器,将为nil
注意点:
当我们向我们的视图控制器容器中调用removeFromParentViewController方法时,必须要先调用该方法,且parent参数为nil:
[将要删除的视图控制器 willMoveToParentViewController:nil];
当我们调用addChildViewController方法时,在添加子视图控制器之前将自动调用该方法。所以,就不需要我们显示调用了。
5、didMoveToParentViewController 方法
|
1
|
- (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]。
经过这几点说明,在一些视图切换的过程中,和视图的换位中,应该可以了解什么时候去调用对应的视图啦。
beginAppearanceTransition的更多相关文章
- iOS BUG: Unbalanced calls to begin/end appearance transitions for <XXXViewController: 0x7fcea3730650>.
自定义TabBarController Push下一级Controller时 会报这样的错误:Unbalanced calls to begin/end appearance transitions ...
- Unbalanced calls to begin/end appearance transitions for **
在自定义UITabBarController中点击视图跳转的时候,有可能就出现这个问题, 解决方法就是在自定义的UITabBarController中的视图显示消失通知方法中添加如下方法: - (vo ...
- Swift - UIViewController
UIViewController类详解: 通过Nib文件初始化 init(nibName nibName: String?, bundle nibBundle: NSBundle?) println( ...
- ios 各种技术
1.NSlog 发布后不打印 #ifdef DEBUG// 如果有DEBUG这个宏就编译下面一句代码 #define DDLog(...) NSLog(__VA_ARGS__) #else // 如 ...
- UIViewController
UIViewController 在MVC模式中就是C.关于MVC,可以看 UIViewController 主要具有什么功能呢? View Management When you define a ...
- iOS应用日志:开始编写日志组件与异常日志
应用日志(一):开始编写日志组件 对于那些做后端开发的工程师来说,看 LOG解Bug应该是理所当然的事,但我接触到的移动应用开发的工程师里面,很多人并没有这个意识,查Bug时总是一遍一遍的试图重现,试 ...
- ios containerViewController
- (void)replaceViewController:(UIViewController *)existingViewController withViewController:(UIViewC ...
- 自定义TabBarController报错 - Unbalanced calls to begin/end appearance transitions for <>
自定义了TabBarController 之后必须实现以下方法才能避免报错 -(void)viewWillAppear:(BOOL)animated { [self.selectedViewContr ...
- iOS 容器控制器 (Container View Controller)
iOS 容器控制器 (Container View Controller) 一个控制器包含其他一个或多个控制器,前者为容器控制器 (Container View Controller),后者为子控制器 ...
随机推荐
- 使用node中的iconv-lite实现对“gbk”格式的转码
在window中,gbk和utf-8是最常见的两种格式,但是我们在显示的时候往往需要将GBK转换为UTF-8,我现在有一个同步读取文件的操作: const fs = require('fs'); co ...
- Java中有几种线程池?
缓存,修正,计划,单一 newCachedThreadPool newFixedThreadPool newScheduleThreadPool newSingleThreadExecutor
- python基础---->python的使用(五)
这里记录一些python的一些基础知识,主要内容是高阶函数的使用.或许我的心包有一层硬壳,能破壳而入的东西是极其有限的.所以我才不能对人一往情深. python中的高阶函数 一.map().reduc ...
- QWidget编写的安卓app
最近为了配套人脸识别的整套设备去检测,特意做了个机关控制app,需要现场修改前端设备和服务器设备的一些参数以便进行检测.qt做一些简单的app还是非常方便的.特意增加了禁用屏保功能.apk文件体验:h ...
- 【大数据系列】HDFS初识
一.HDFS介绍 HDFS为了做到可靠性(reliability)创建了多分数据块(data blocks)的复制(replicas),并将它们放置在服务集群的计算节点中(compute nodes) ...
- Volley overview
https://developer.android.com/training/volley/ 需FQ https://developer.android.google.cn/training/vo ...
- Sencha Cmd 5.0.1.231 是坑爹货
Sencha Cmd 5.0.1.231相比之前的版本有了很大的变动,存在很多坑爹之处,个人建议不要升级到这个版本,如果已经升级了的就卸载了还原到以前的版本吧. 历史版本下载地址:http://cdn ...
- linux常用命令大全2--挂载/dpkg/文件系统分析/apt/光盘/关机
挂载一个文件系统 mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2 ...
- WCF错误"The maximum message size quota for incoming messages (65536) has been exceeded."
错误原因有三:超过最大接受的传输值 1.webconfig或者 app.config 文件中的binding 节点进行 配置 maxBufferSize="2147483647" ...
- 使用Btrace来动态监控方法的参数和返回值
btrace简介: btrace是一种动态跟踪分析一个运行中的Java应用程序的工具,它基于java的探针技术动态地向目标应用程序的字节码注入追踪代码(字节码追踪),这些追踪字节码追踪代码使用Java ...