• transitionFromViewController方法的使用


    转自:http://blog.sina.com.cn/s/blog_7b9d64af0101c2vm.html

    1.背景
     

    iOS 5.0 以前 ,我们在一个视图控制器中会用addSubView方法来添加很多子View,并进行对这些子View的控制。

     

    但是,这样做,有一个问题:

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

    2.替代方法
     
    聪明的你,也许已经体会到了,该transitionFromViewController方法闪亮登场:
     

    苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。

    对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去;需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。

    这样做的好处:

     

    1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。

    2.当某个子View没有显示时,将不会被Load,减少了内存的使用。

    3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。

     
    3.transitionFromViewController:toViewController:duration:options:animations:completion 方法
     

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

    在两个子视图控制器中转换。支持的iOS 5.0以及以后的版本。

    fromViewController:当前显示在父视图控制器中的子视图控制器

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

    duration:完成过渡的时间;单位:秒。

    options:指定的过渡效果。

    animations:转换过程中,的动画。是个Block块操作。

    completion:过渡完成后,执行的Block块操作。

    该方法,执行完以后,fromViewController指代的视图控制器的View将从界面消失;

    toViewController所指代的视图控制器的View将被载入到页面中。

     
    4.使用方法
     
    1.在父ViewController中,使用方法,将各个子添加进来。
     

    - (void)viewDidLoad{

        [super viewDidLoad];

        // 对于不显示的子ViewController,要用addChildViewController方法,将其添加到父ViewController

        firstViewController=[[FirstViewController alloc] initWithNibName:@"FirstViewController"bundle:nil];

        [self addChildViewController:firstViewController];

        secondViewController=[[SecondViewController alloc] initWithNibName:@"SecondViewController"bundle:nil];

        [self addChildViewController:secondViewController];

        thirdViewController=[[ThirdViewController alloc] initWithNibName:@"ThirdViewController"bundle:nil];

        [self addChildViewController:thirdViewController];

        // 需要显示的子ViewController,要将其View添加到父View

        [self.view addSubview:thirdViewController.view];

        currentViewController=thirdViewController;

    }

     
    2.根据按钮事件,来transitionFromViewController方法来切换相应的子View
     

    -(IBAction)onClickbutton:(id)sender

    {

        if ((currentViewController==firstViewController&&[sender tag]==1)||(currentViewController==secondViewController&&[sender tag]==2) ||(currentViewController==thirdViewController&&[sender tag]==3) ) {

            return;

        }

        UIViewController *oldViewController=currentViewController;

        switch ([sender tag]) {

            case 1:{

                NSLog(@"留言及回复");

                [self transitionFromViewController:currentViewController

                                  toViewController:firstViewController

                                          duration:1

                                           options:UIViewAnimationOptionTransitionCurlUp

                                        animations:^{

                                            // NOPS

                                        }

                                        completion:^(BOOL finished) {

                                            if (finished) {

                                                currentViewController=firstViewController;

                                            }else{

                                                currentViewController=oldViewController;

                                            }

                                        }];

            }

                break;

            case 2:{

                NSLog(@"生日提醒");

                [self transitionFromViewController:currentViewController

                                  toViewController:secondViewController

                                          duration:1

                                           options:UIViewAnimationOptionTransitionCurlDown

                                        animations:^{

                                        }

                                        completion:^(BOOL finished) {

                                            if (finished) {

                                                currentViewController=secondViewController;

                                            }else{

                        currentViewController=oldViewController;

                                            }

                                        }];

                

                

            }

                

                break;

            case 3:

            {

                NSLog(@"好友申请");

                [self transitionFromViewController:currentViewController

                                  toViewController:thirdViewController

                                          duration:1

                                           options:UIViewAnimationOptionTransitionCrossDissolve

                                        animations:^{

                                        }

                                        completion:^(BOOL finished) {

                                            if (finished) {

                                                currentViewController=thirdViewController;

                                            }else{

                                                currentViewController=oldViewController;

                                            }

                                        }];

            }

                break;

            default:

                break;

        }

    }

     
    注明:该源代码是从上下载的,谢谢该代码作者的分享!
    源代码,下载!
     
    希望对你有所帮助!
  • 相关阅读:
    微信小程序在扫一扫进入小程序的时候 安卓手机后台继续运行的常规处理
    在微信小程序上,帮助中心界面实现类似手风琴案例
    使用artTemplate的模板引擎,使用简单
    使用原生JavaScript实现图片预加载,方法简单代码少
    在wepy框架中 使用promise对发送网络请求进行封装 包括post跟get请求
    JavaScript实现按字典排序进行md5加密, 以及个人在小程序也可以实现
    当在微信扫一扫进入小程序 并获取到二维码的参数 从而实现扫码进入小程序
    第九章:看看精彩的世界-使用网络技术
    玉渊潭公园
    军事博物馆
  • 原文地址:https://www.cnblogs.com/wangpei/p/3714182.html
Copyright © 2020-2023  润新知