iOS 开发笔记-控制器tab切换view显示
在开发过程中,我们常常会碰到一种情况就是,在一个controller里面,经常要放很多复杂的控制,最常用的就是tar切换。tar切换,原理就是在一个controller里面,显示另一个controller的view。
如果发现:控制器的view还在,但是view上面的数据不显示,极大可能是因为:控制器被提前销毁了
- 一个控制器的view是可以随意调整尺寸和位置的
- 一个控制器的view是可以随意添加到其他view中
- 如果将一个控制器的view,添加到其他view中显示,那么要想办法保证控制器不被销毁
- 原则:只要view在,view所在的控制器必须得在,这样才能保证view内部的数据和业务逻辑正常
简单例子
//
// ViewController.m
// 控制器tab切换view显示
//
// Created by jiangys on 15/10/11.
// Copyright © 2015年 Jiangys. All rights reserved.
// #import "ViewController.h" #import "OneViewController.h"
#import "TwoViewController.h"
#import "ThreeViewController.h" @interface ViewController ()
- (IBAction)vc1;
- (IBAction)vc2;
- (IBAction)vc3; /** one */
@property (nonatomic, strong) OneViewController *one;
/** two */
@property (nonatomic, strong) TwoViewController *two;
/** three */
@property (nonatomic, strong) ThreeViewController *three; @end @implementation ViewController - (OneViewController *)one
{
if (!_one) {
self.one = [[OneViewController alloc] init];
self.one.view.frame = CGRectMake(, , , );
}
return _one;
} - (TwoViewController *)two
{
if (!_two) {
self.two = [[TwoViewController alloc] init];
self.two.view.frame = CGRectMake(, , , );
}
return _two;
} - (ThreeViewController *)three
{
if (!_three) {
self.three = [[ThreeViewController alloc] init];
self.three.view.frame = CGRectMake(, , , );
}
return _three;
} - (void)viewDidLoad {
[super viewDidLoad];
// HestViewController *test = [[TestViewController alloc] init];
// test.view.frame = CGRectMake(100, 100, 200, 300);
// test.view.backgroundColor = [UIColor redColor];
// [self.view addSubview:test.view];
// self.test = test; // 如果发现:控制器的view还在,但是view上面的数据不显示,极大可能是因为:控制器被提前销毁了 // 1.一个控制器的view是可以随意调整尺寸和位置的
// 2.一个控制器的view是可以随意添加到其他view中
// 3.如果将一个控制器的view,添加到其他view中显示,那么要想办法保证控制器不被销毁
// 4.原则:只要view在,view所在的控制器必须得在,这样才能保证view内部的数据和业务逻辑正常
} - (IBAction)vc1 {
[self.two.view removeFromSuperview];
[self.three.view removeFromSuperview];
[self.view addSubview:self.one.view];
} - (IBAction)vc2 {
[self.one.view removeFromSuperview];
[self.three.view removeFromSuperview];
[self.view addSubview:self.two.view];
} - (IBAction)vc3 {
[self.two.view removeFromSuperview];
[self.one.view removeFromSuperview];
[self.view addSubview:self.three.view];
}
@end
效果:
上面的做法确实是可以实现了效果,但却隐藏了很多隐患。比如,self.View 屏幕旋转,并不会通知到子控制器。当然还有很多其它的问题。
解决方案:
- 当控制器的view互为父子关系,那么控制器最好也互为父子关系
- 通过addChildViewController添加一个子控制器,那么这个子控制器就会被放到ChildViewControllers数据中,只要self存在,那么ChildViewControllers数组就会一直存在
修改:
//
// ViewController.m
// 控制器tab切换view显示
//
// Created by jiangys on 15/10/11.
// Copyright © 2015年 Jiangys. All rights reserved.
// #import "ViewController.h" #import "OneViewController.h"
#import "TwoViewController.h"
#import "ThreeViewController.h" @interface ViewController ()
- (IBAction)vc1;
- (IBAction)vc2;
- (IBAction)vc3; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; // 当控制器的view互为父子关系,那么控制器最好也互为父子关系
OneViewController *one=[[OneViewController alloc] init];
one.view.frame = CGRectMake(, , , );
// 通过addChildViewController添加一个子控制器,那么这个子控制器就会被放到ChildViewControllers数据中
// 只要self存在,那么ChildViewControllers数组就会一直存在
[self addChildViewController:one]; TwoViewController *two=[[TwoViewController alloc] init];
two.view.frame = CGRectMake(, , , );
[self addChildViewController:two]; ThreeViewController *three=[[ThreeViewController alloc] init];
three.view.frame = CGRectMake(, , , );
[self addChildViewController:three]; } - (IBAction)vc1 {
OneViewController *one = self.childViewControllers[];
TwoViewController *two = self.childViewControllers[];
ThreeViewController *three = self.childViewControllers[]; [two.view removeFromSuperview];
[three.view removeFromSuperview];
[self.view addSubview:one.view];
} - (IBAction)vc2 {
OneViewController *one = self.childViewControllers[];
TwoViewController *two = self.childViewControllers[];
ThreeViewController *three = self.childViewControllers[]; [one.view removeFromSuperview];
[three.view removeFromSuperview];
[self.view addSubview:two.view];
} - (IBAction)vc3 {
OneViewController *one = self.childViewControllers[];
TwoViewController *two = self.childViewControllers[];
ThreeViewController *three = self.childViewControllers[]; [two.view removeFromSuperview];
[one.view removeFromSuperview];
[self.view addSubview:three.view];
}
@end
源码下载:http://pan.baidu.com/s/1pJ5VXV1
iOS 开发笔记-控制器tab切换view显示的更多相关文章
- iOS 开发笔记-控制器翻页
找了一天,终于找到了两个能用的. 1.https://github.com/wangmchn/WMPageController 2.https://github.com/everettjf/EVTTa ...
- iOS开发:使用Tab Bar切换视图
iOS开发:使用Tab Bar切换视图 上一篇文章提到了多视图程序中各个视图之间的切换,用的Tool Bar,说白了还是根据触发事件使用代码改变Root View Controller中的Conten ...
- iOS开发笔记7:Text、UI交互细节、两个动画效果等
Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...
- iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...
- IOS开发笔记 IOS如何访问通讯录
IOS开发笔记 IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...
- iOS开发笔记--什么时候调用layoutSubviews
iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...
- 【Swift】iOS开发笔记(二)
前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯 ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...
- IOS开发笔记(4)数据离线缓存与读取
IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...
随机推荐
- Mac Mini2018 开箱(视频)全球首映!Kindle 开箱一并奉上(文字)
2018.12.9更新 为了方便大家收看我的这个开箱视频,我把视频放在知乎上了,可以参考如下连接即可观看啦: https://zhuanlan.zhihu.com/p/51677467 ------- ...
- 1.7Oob 成员变量可以不初始化 但局部变量必须初始化
成员变量有默认的初始值 像int a; a默认为0:而局部变量没有初始值
- C和C指针小记(二)-注释,三字母词,编译选项
课后的几个问题: 1) int x/*blah blah*/y; 会有什么问题? 答:编译器报错,语句中不应该有多行注释 单行注释也应该放到语句后面或者独自占一行. 2)打出下面一行字符串(包括引号) ...
- new malloc 区别
http://www.cplusplus.com/reference/cstdlib/malloc/ http://www.cplusplus.com/reference/new/operator%2 ...
- day0321 生成器
一.生成器 1.迭代器: 1.1.调用方法直接返回 1.2.可迭代对象通过执行iter方法得到 迭代器的优势:节省内存. 2.生成器:有些情况我们也需要也需要节省空间,只能是自己写来实现迭代器的功能就 ...
- [development][dpdk][hugepage] 为不同的结点分配不同大小的大页内存
这个事来自dpdk, 所以, 先参考. http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html 当前, 假设你已经读过上边内容, 知道大页内存时候, dp ...
- mysql学习【第5篇】:事务索引备份视图
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! mysql学习[第5篇]:事务索引备份视图 MySQL事务 事务就是将一组SQL语句放在同一批次 ...
- 树和二叉树->其他(待完善)
关于树和二叉树的部分,还有如下三个知识点,待以后时间更充裕的时候再回头完善. 1 树与等价问题 文字描述 关于等价关系和等价类的定义,在离散数学上的描述有点拗口, 其实在数据结构中,这部分相关的主要是 ...
- kubernetes有状态集群服务部署与管理
有状态集群服务的两个需求:一个是存储需求,另一个是集群需求.对存储需求,Kubernetes的解决方案是:Volume.Persistent Volume .对PV,除了手动创建PV池外,还可以通过S ...
- Android SDK下载和更新失败的如何解决
一.scenario: 在部署Appium环境搭建时,安装SDK Manager.exe,遇到Android SDK下载更新失败. 报错信息如下图: Failed to fetch URL https ...