博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
transitionFromViewController方法的使用
阅读量:4954 次
发布时间:2019-06-12

本文共 3745 字,大约阅读时间需要 12 分钟。

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:()durationoptions:()options animations:(void (^)(void))animationscompletion:(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;

    }

}

注明:该源代码是从上下载的,谢谢该代码作者的分享!
源代码,!
希望对你有所帮助!

转载于:https://www.cnblogs.com/zsw-1993/p/4879787.html

你可能感兴趣的文章
P2093 [国家集训队]JZPFAR(KDTree)
查看>>
LOJ#6046. 「雅礼集训 2017 Day8」爷(分块)
查看>>
修改/etc/profile导致常用命令不可用的解决办法
查看>>
querySelector与getElementBy等的区别
查看>>
X86段机制
查看>>
LeetCode:Remove Duplicates from Sorted List
查看>>
刷新加载1
查看>>
ROC-RK3308-CC开发实例总结——HZ711 压力传感器的使用方法
查看>>
MySQL数据备份之mysqldump使用(转)
查看>>
View转化为bitmap
查看>>
关闭Android应用程序[学习笔记一]
查看>>
新手学appium-appium错误截图
查看>>
amchart使用柱状图配置
查看>>
前端时间戳和时间转换
查看>>
二分图——最大不可互相到达数 = 最小路径覆盖数
查看>>
C#中抽象类和接口的区别(二)
查看>>
一、线性结构
查看>>
[SPOJ2021] Moving Pebbles
查看>>
Log4Net不同日志类型写入到不同文件
查看>>
VR AR MR的未来
查看>>