UIView的AddChildViewCtroller的用法

———子控制器视图的切换

一.视图控制器的4种切换方式

1.使用presentViewController方法进行切换

适合于顺序型的页面转换,比如说某中验证(登录信息)型的,而且可以通过dismissViewController方便的回到父页面,默认动画从上而下。

2.使用pushViewController方法(前提是使用了导航控制器)

可以很方便的返回,层次感比较强,切换方式为左右,跳转到某个特定的控制器。

返回上一个页面调用popViewController

问题:在IB中生成含导航控制器的页面,代码中怎么对这个页面传输数据了?

答:可以通过获取到导航控制器,使用它的viewController属性和对应的下标可以得到相应控制器的对象,并可对它修改或赋值,跳转页面后有效。

3.使用addChildViewController方法

在没有导航控制器的情况下在多层次的视图页面中自由跳转,优点:

1.页面逻辑很清晰,相应的View对应相应的ViewController。

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

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

4.一个页面中可以添加多个ViewController,并且可以在需要显示时才load它。

5.页面的切换方式可以在transitionViewController中选择(左右、上下、融化)

ios5后ViewController中新添加了下面几个方法。

addChildViewController:
removeFromParentViewController
transitionFromViewController:toViewController:duration:options:animations:completion:  //切换页面显示调用
willMoveToParentViewController:
didMoveToParentViewController:

4.自定义。

二.使用AddChildViewcontroller切换视图(Object-C)

 使用该功能可以解决多label切换控制器的需求。

使用AddChildViewcontroller简单切换视图、可以运用到多分栏子页面切换(没有切换父控制器),以下只是简单使用AddChildViewcontroller,并没有明显切换过程,如果需要,可以自己添加按钮切换。

切换过渡代码段:

    /// 切换子控制器///这种方式可以保证同一时刻只有一个subController///- parameter old : 之前的控制器///- parameter new : 之后的控制器///- warning : 传入的参数必须有共同的父容器控制器。且不能传入父容器控制器(建议制作容器,不要做View显示操作。)fileprivate func transition(old: UIViewController, new:UIViewController) -> Void {self.transition(from: old, to: new, duration: 0.1, options: .curveEaseIn, animations: {//过渡操作}) { (isFinish) inif isFinish{self.currentViewController = new  //currentViewController 自定义新添加的。}else {self.currentViewController = old}}}

示例代码:

import UIKitclass ViewController: UIViewController { //这里的Controller 建议只做容器Controller 不做界面显示var vc1: UIViewController!var vc2: UIViewController!var currentViewController : UIViewController!override func viewDidLoad() {super.viewDidLoad()initConrollers()currentViewController = self}override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()// Dispose of any resources that can be recreated.}//MARK: -private method///初始化和调整Controller///建议使用for循环和数组处理func initConrollers() -> Void {vc1 =  self.storyboard?.instantiateViewController(withIdentifier: String(describing: SencondViewController.self))vc1.view.frame = CGRect(origin: CGPoint.init(x: 0, y: 40), size: vc1.view.bounds.size) //调整下frame 以显示顶部的label选项卡self.addChildViewController(vc1!)vc1.didMove(toParentViewController: self)  //建议调用该方法vc2 =  self.storyboard?.instantiateViewController(withIdentifier: String(describing: ThirdViewController.self))vc2.view.frame = CGRect(origin: CGPoint.init(x: 0, y: 40), size: vc2.view.bounds.size)self.addChildViewController(vc2!)vc2.didMove(toParentViewController: self)self.view.addSubview(vc1.view)  //显示某个控制器下的View【第一个要显示的View】//}//MARK: -IBAction@IBAction func toViewController1ButtonTap(_ sender: UIButton, forEvent event: UIEvent) {self.transition(old: vc2, new: vc1)
//        vc2.view.removeFromSuperview()
//        self.view.addSubview(vc1.view)}@IBAction func toViewController2ButtonTap(_ sender: UIButton) {self.transition(old: vc1, new: vc2)
//        vc1.view.removeFromSuperview()
//         self.view.addSubview(vc2.view)//如果使用这个切花Veiw 记得先移除,不然就会有两层,建议是哟并transitionxxxxxxx}/// 切换子控制器///这种方式可以保证同一时刻只有一个subController///- parameter old : 之前的控制器///- parameter new : 之后的控制器///- warning : 传入的参数必须有共同的父容器控制器。且不能传入父容器控制器(建议制作容器,不要做View显示操作。)fileprivate func transition(old: UIViewController, new:UIViewController) -> Void {self.transition(from: old, to: new, duration: 0.1, options: .curveEaseIn, animations: {//过渡操作}) { (isFinish) inif isFinish{self.currentViewController = new  //currentViewController 自定义新添加的。}else {self.currentViewController = old}}}
}

效果展示:

UIView的AddChildViewCtroller的用法(4中页面切换方式)相关推荐

  1. 【uniapp】uniapp中页面传值方式总结

    1.传递一个或多个参数 在跳转页面的路由后添加"?"后开始写自己需要传递的参数名,如代码中的buyId,由于这里是使用 ` ,即反引号,所以使用${}作占位符,而不需要字符串拼接, ...

  2. QTabWidget——创建标签页的多页面切换

    QTabWidget 用来分页显示 重要函数: 1.void setTabText(int, QString); //设置页面的名字. 2.void setTabToolTip(QString); / ...

  3. 【转】ASP.NET中页面传值

    http://www.cnblogs.com/wenly/archive/2008/06/10/1216678.html 一.目前在ASP.NET中页面传值共有这么几种方式: 1.表单提交,    & ...

  4. html对话框跳转页面,html5各种页面切换效果和模态对话框用法总结

    这篇文章主要为大家介绍了html5各种页面切换效果和模态对话框用法总结,较为详细的介绍了HTML5的各种页面元素的使用技巧,非常具有实用价值,需要的朋友可以参考下 本文详细总结了html5各种页面切换 ...

  5. java attributes用法_C#中的Attributes的用法

    今天研究了一下C#中的Attributes的用法,感觉很有用,现总结以下: 在前台用JS写的脚本方法,除了可以直接用在前台控件的属性中,还可以在后台运用. 即在后台页面加载时,调用JS方法.语法格式有 ...

  6. oracle中rollback用法,Oracle中SAVEPOINT和ROLLBACK用法

    savepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepoint来标识不同的点.如果遇到错误,就可以rollback到不同的点或直接回来事 ...

  7. html页面判断其他div为空,将外部html加载到div中 - 页面加载然后变为空白

    我确信这将会变成一件愚蠢的事情,但是自从我成为JavaScript noob以来,这里就变成了一件愚蠢的事情.将外部html加载到div中 - 页面加载然后变为空白 我想外部HTML内容加载到我的索引 ...

  8. 设计点击左侧切换页面进出_Axure教程:(初级)导航中的页面切换

    本文给大家讲讲如何利用Axure进行导航中的页面切换,一起来看看~ 一.页面布局 (1)从左侧元件库拉入两个矩形作为导航按钮,分别命名为:页面1.页面2. (2)从左侧元件库拉入一个动态面板作为页面内 ...

  9. Vue 单文件组件||Vue 单文件组件的基本用法||webpack 中配置 vue 组件的加载器|| 在 webpack 项目中使用 vue

    Vue 单文件组件 传统组件的问题和解决方案 1. 问题 1. 全局定义的组件必须保证组件的名称不重复 2. 字符串模板缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的 \ 3. 不支持 CS ...

最新文章

  1. BusinessObject Port 配置
  2. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
  3. 当退出python时是否释放全部内存_python如何释放内存
  4. 纯后台生成highcharts图片有哪些方法?
  5. windows 开启telnet 功能
  6. Qt文档阅读笔记-Object Model初步解析
  7. 使用Postman对Restful接口进行测试
  8. 一个核心系统 3 万多行代码的重构之旅
  9. Spark in action on Kubernetes - 存储篇(一)
  10. itellij jdk多重选择Class JavaLaunchHelper is implemented in both
  11. 计算机无法读光盘,win10系统无法读取光盘如何解决 win10系统读取光盘失败的解决方法...
  12. 确定有限自动机DFA和非确定有限自动机NFA
  13. OpenGL第二讲——绘制简单的几何图形
  14. vim的安装以及基础使用方法;
  15. 使用for循环打印空心菱形图案
  16. 小程序中maring-top、maring-left、maring-right、maring-bottom失效/没有用的原因及解决方案
  17. 遇到数据库隔离性问题(读已提交和可重复读、可重复读导致调息前后两次查询数据一样)
  18. 微型计算机室内太干燥,暖气屋里太干燥怎么办 七种方法增加室内湿度
  19. Python股票监控机器人,加强版!
  20. PPT设置自动保存时间 mac_如何一键把Word转换为PPT?

热门文章

  1. 请用状态转换图描述一个绘制折线的对话过程_CAD画一个元器件电路符号(AD)...
  2. Vue -- 配合iView实现省市二级联动
  3. python基础训练题2-元组,字典
  4. [JavaScript]只需一行代码,轻松搞定快捷留言-V2升级版
  5. FZU 2159 WuYou
  6. Java-第三章-使用if选择结构实现,如果年龄够7岁或5岁并且是男,可以搬桌子
  7. iOS使用多线程提高数据并发访问 之七
  8. wordpress给后台文章列表增加自定义排序栏
  9. day16-小数据池
  10. JavaScript实现放大镜功能