在开发过程中,我们常常会碰到一种情况就是,在一个controller里面,经常要放很多复杂的控制,最常用的就是tar切换。tar切换,原理就是在一个controller里面,显示另一个controller的view。

如果发现:控制器的view还在,但是view上面的数据不显示,极大可能是因为:控制器被提前销毁了

  1. 一个控制器的view是可以随意调整尺寸和位置的
  2. 一个控制器的view是可以随意添加到其他view中
  3. 如果将一个控制器的view,添加到其他view中显示,那么要想办法保证控制器不被销毁
  4. 原则:只要view在,view所在的控制器必须得在,这样才能保证view内部的数据和业务逻辑正常

简单例子

  1. //
  2. // ViewController.m
  3. // 控制器tab切换view显示
  4. //
  5. // Created by jiangys on 15/10/11.
  6. // Copyright © 2015年 Jiangys. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10.  
  11. #import "OneViewController.h"
  12. #import "TwoViewController.h"
  13. #import "ThreeViewController.h"
  14.  
  15. @interface ViewController ()
  16. - (IBAction)vc1;
  17. - (IBAction)vc2;
  18. - (IBAction)vc3;
  19.  
  20. /** one */
  21. @property (nonatomic, strong) OneViewController *one;
  22. /** two */
  23. @property (nonatomic, strong) TwoViewController *two;
  24. /** three */
  25. @property (nonatomic, strong) ThreeViewController *three;
  26.  
  27. @end
  28.  
  29. @implementation ViewController
  30.  
  31. - (OneViewController *)one
  32. {
  33. if (!_one) {
  34. self.one = [[OneViewController alloc] init];
  35. self.one.view.frame = CGRectMake(, , , );
  36. }
  37. return _one;
  38. }
  39.  
  40. - (TwoViewController *)two
  41. {
  42. if (!_two) {
  43. self.two = [[TwoViewController alloc] init];
  44. self.two.view.frame = CGRectMake(, , , );
  45. }
  46. return _two;
  47. }
  48.  
  49. - (ThreeViewController *)three
  50. {
  51. if (!_three) {
  52. self.three = [[ThreeViewController alloc] init];
  53. self.three.view.frame = CGRectMake(, , , );
  54. }
  55. return _three;
  56. }
  57.  
  58. - (void)viewDidLoad {
  59. [super viewDidLoad];
  60. // HestViewController *test = [[TestViewController alloc] init];
  61. // test.view.frame = CGRectMake(100, 100, 200, 300);
  62. // test.view.backgroundColor = [UIColor redColor];
  63. // [self.view addSubview:test.view];
  64. // self.test = test;
  65.  
  66. // 如果发现:控制器的view还在,但是view上面的数据不显示,极大可能是因为:控制器被提前销毁了
  67.  
  68. // 1.一个控制器的view是可以随意调整尺寸和位置的
  69. // 2.一个控制器的view是可以随意添加到其他view中
  70. // 3.如果将一个控制器的view,添加到其他view中显示,那么要想办法保证控制器不被销毁
  71. // 4.原则:只要view在,view所在的控制器必须得在,这样才能保证view内部的数据和业务逻辑正常
  72. }
  73.  
  74. - (IBAction)vc1 {
  75. [self.two.view removeFromSuperview];
  76. [self.three.view removeFromSuperview];
  77. [self.view addSubview:self.one.view];
  78. }
  79.  
  80. - (IBAction)vc2 {
  81. [self.one.view removeFromSuperview];
  82. [self.three.view removeFromSuperview];
  83. [self.view addSubview:self.two.view];
  84. }
  85.  
  86. - (IBAction)vc3 {
  87. [self.two.view removeFromSuperview];
  88. [self.one.view removeFromSuperview];
  89. [self.view addSubview:self.three.view];
  90. }
  91. @end

效果:

上面的做法确实是可以实现了效果,但却隐藏了很多隐患。比如,self.View 屏幕旋转,并不会通知到子控制器。当然还有很多其它的问题。

解决方案:

  1. 当控制器的view互为父子关系,那么控制器最好也互为父子关系
  2. 通过addChildViewController添加一个子控制器,那么这个子控制器就会被放到ChildViewControllers数据中,只要self存在,那么ChildViewControllers数组就会一直存在

修改:

  1. //
  2. // ViewController.m
  3. // 控制器tab切换view显示
  4. //
  5. // Created by jiangys on 15/10/11.
  6. // Copyright © 2015年 Jiangys. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10.  
  11. #import "OneViewController.h"
  12. #import "TwoViewController.h"
  13. #import "ThreeViewController.h"
  14.  
  15. @interface ViewController ()
  16. - (IBAction)vc1;
  17. - (IBAction)vc2;
  18. - (IBAction)vc3;
  19.  
  20. @end
  21.  
  22. @implementation ViewController
  23.  
  24. - (void)viewDidLoad {
  25. [super viewDidLoad];
  26.  
  27. // 当控制器的view互为父子关系,那么控制器最好也互为父子关系
  28. OneViewController *one=[[OneViewController alloc] init];
  29. one.view.frame = CGRectMake(, , , );
  30. // 通过addChildViewController添加一个子控制器,那么这个子控制器就会被放到ChildViewControllers数据中
  31. // 只要self存在,那么ChildViewControllers数组就会一直存在
  32. [self addChildViewController:one];
  33.  
  34. TwoViewController *two=[[TwoViewController alloc] init];
  35. two.view.frame = CGRectMake(, , , );
  36. [self addChildViewController:two];
  37.  
  38. ThreeViewController *three=[[ThreeViewController alloc] init];
  39. three.view.frame = CGRectMake(, , , );
  40. [self addChildViewController:three];
  41.  
  42. }
  43.  
  44. - (IBAction)vc1 {
  45. OneViewController *one = self.childViewControllers[];
  46. TwoViewController *two = self.childViewControllers[];
  47. ThreeViewController *three = self.childViewControllers[];
  48.  
  49. [two.view removeFromSuperview];
  50. [three.view removeFromSuperview];
  51. [self.view addSubview:one.view];
  52. }
  53.  
  54. - (IBAction)vc2 {
  55. OneViewController *one = self.childViewControllers[];
  56. TwoViewController *two = self.childViewControllers[];
  57. ThreeViewController *three = self.childViewControllers[];
  58.  
  59. [one.view removeFromSuperview];
  60. [three.view removeFromSuperview];
  61. [self.view addSubview:two.view];
  62. }
  63.  
  64. - (IBAction)vc3 {
  65. OneViewController *one = self.childViewControllers[];
  66. TwoViewController *two = self.childViewControllers[];
  67. ThreeViewController *three = self.childViewControllers[];
  68.  
  69. [two.view removeFromSuperview];
  70. [one.view removeFromSuperview];
  71. [self.view addSubview:three.view];
  72. }
  73. @end

源码下载:http://pan.baidu.com/s/1pJ5VXV1

iOS 开发笔记-控制器tab切换view显示的更多相关文章

  1. iOS 开发笔记-控制器翻页

    找了一天,终于找到了两个能用的. 1.https://github.com/wangmchn/WMPageController 2.https://github.com/everettjf/EVTTa ...

  2. iOS开发:使用Tab Bar切换视图

    iOS开发:使用Tab Bar切换视图 上一篇文章提到了多视图程序中各个视图之间的切换,用的Tool Bar,说白了还是根据触发事件使用代码改变Root View Controller中的Conten ...

  3. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  4. iOS开发UI篇—使用picker View控件完成一个简单的选餐应用

    iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...

  5. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

  6. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  7. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  8. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  9. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

随机推荐

  1. MSSQL SQL Server代理 作业 设置(调用存储过程)

    1.新建作业名 “生成分区文件及文件组“ 2.新建  步骤  名 “CreatePartTable” 步骤名:CreatePartTable 类型:Transact-SQL 脚本(T-SQL) 数据库 ...

  2. PAT甲级1061 Dating

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805411985604608 题意: 给定四个字符串. 前两个字符串 ...

  3. TOP100summit:【分享实录-QQ空间】10亿级直播背后的技术优化

    本篇文章内容来自2016年TOP100summit QQ空间客户端研发总监王辉的案例分享.编辑:Cynthia 王辉:腾讯SNG社交平台部研发总监.腾讯QQ空间移动客户端技术负责人高级工程师.09年起 ...

  4. 用Python下载美国国家气候数据中心(NCDC)的气候数据

    美国国家气候数据中心的官网地址是https://www.ncdc.noaa.gov/ 气候数据的下载地址是: 长格式:ftp://ftp.ncdc.noaa.gov/pub/data/noaa/,这种 ...

  5. Transfrom笔记

    1.在不是以左上角为缩放点进行缩放时,其实比例不能为0,因为0将导致缩放可能出现动画效果不可控,务必选取0.1等较小值来变化

  6. JS之JSON.parse和JSON.stringify

    这两个函数有兼容性问题, 会报错JSON"未定义 解决方案, 引入json2.js,可以解决浏览器的兼容性 https://link.jianshu.com/?t=https://githu ...

  7. 转:java内部类作用

    原文地址:https://www.cnblogs.com/uu5666/p/8185061.html 一. 定义 放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏, 一般 ...

  8. Java基础知识之集合

    Collection集合 特点:长度可变,只能存储引用类型,可以存储不同的类型的元素 list 特点:元素有序(存储和取出的顺序一致),元素可以重复.list除了可以用迭代器循环遍历之外,因为其是有序 ...

  9. 【Python基础】json.dumps()和json.loads()、json.dump()和json.load()的区分

    json文件处理涉及的四个函数json.dumps()和json.loads().json.dump()和json.load()的区分 一.概念理解 1.json.dumps()和json.loads ...

  10. winform创建快捷方式

    /// <summary> /// 创建快捷方式 /// </summary> public class Lnk { /// <summary> /// 创建快捷方 ...