如何自己写一个容器来实现viewController之间的切换

2024-05-08 03:18

本文主要是介绍如何自己写一个容器来实现viewController之间的切换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

</pre>视图控制器:ViewController<p></p><p><span style="font-size:18px"></span></p><p><span style="font-size:18px">在iOS程序开发中官方提供了四种切换ViewController的方法:</span></p><p><span style="font-size:18px"></span></p><p><span style="font-size:18px">01   模态视图切换</span></p><p><span style="font-size:18px">02    <span style="font-family:Menlo">UINavigationController</span></span></p><p><span style="font-size:18px"><span style="font-family:Menlo">03 </span><span style="font-family:Menlo">UITabBarController</span></span></p><p><span style="font-size:18px"><span style="font-family:Menlo">04 </span><span style="color:rgb(52,149,175); font-family:Menlo">addChildViewController</span></span></p><p><span style="font-size:18px"><span style="color:rgb(52,149,175); font-family:Menlo">   在子视图控制中如何获取容器视图控制器呢?</span></span></p><p><span style="font-size:18px"><span style="color:rgb(52,149,175); font-family:Menlo"><span style="white-space:pre">	</span></span></span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: 'Heiti SC Light'; color: rgb(0, 143, 0);"><span style="font-family: 'Helvetica Neue';"><span style="white-space:pre">	</span>//</span>找到当前视图控制器所在的容器</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(52, 149, 175);"><span style="color: #000000">    </span>PSBMedicalViewController<span style="color: #000000"> * mvc = (</span><span style="font-family: 'Helvetica Neue'; color: rgb(4, 51, 255);">id</span><span style="color: #000000">)</span><span style="font-family: 'Helvetica Neue'; color: rgb(4, 51, 255);">self</span><span style="color: #000000">.</span>parentViewController<span style="color: #000000">;</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; min-height: 21px;">    </p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(52, 149, 175);"><span style="color: #000000">    [mvc </span>popRightDrawer<span style="color: #000000">];</span></p><p><span style="font-size:18px; color:#cc0000"><span style="font-family:Menlo">第四种方式我们用来自定义容器时,切换ViewController。</span></span></p><p><span style="font-size:18px"><span style="color:rgb(52,149,175); font-family:Menlo"></span></span></p><p><span style="font-size:18px"><span style="font-family:Menlo">视图控制器有两类:1:显示的视图控制器 2:不显示的视图控制器,用来管理其他子视图控制器的视图控制器。称为:容器视图控制器。</span></span></p><p></p><p><span style="white-space:pre">	</span><span style="font-size:24px;color:#cc0000;">注意:自定义的容器视图控制器,是不能被释放的。为此,有多种方式让其不被释放,1:单例,2:交给NavigationBar中ViewControllers这个数组。</span></p><p></p><p></p><pre name="code" class="objc">#import "PSBRootViewController.h"/**自定义的容器控制器,管理其他的视图控制器,本身不显示*/
@interface AZMedicalViewController : PSBRootViewController//弹出右侧的抽屉
-(void)popRightDrawer;//收起右侧抽屉
-(void)hideRightDrawer;
@end

#import "AZMedicalViewController.h"
#import "AZFirstLayerModel.h"@interface AZMedicalViewController ()
{//判断当前抽屉是否显示BOOL _isDrawerShow;}@end@implementation AZMedicalViewController- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];if (self) {// Custom initialization}return self;
}- (void)viewDidLoad
{[super viewDidLoad];//创建相关子视图[self createSubView];//在这里,添加被管理的子视图控制器[self createChildViewcontrollers];}- (void)didReceiveMemoryWarning
{[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}
//创建相关子视图
-(void)createSubView
{PSBBarButtonItem *backButton=[PSBViewFactory backButton];[backButton addTarget:self action:@selector(backButtonOnClick:) forControlEvents:UIControlEventTouchUpInside];[_nvgItem addSubview:backButton];
}-(void)backButtonOnClick:(PSBBarButtonItem *)item
{if (!_isDrawerShow){[self.navigationController popViewControllerAnimated:YES];}else{[self hideRightDrawer];}
}#pragma mark -- 容器视图控制器的相关方法
//添加子视图控制器
-(void)addChildViewControllers:(NSArray *)vcs
{if (vcs.count!=2) {return;}for (NSUInteger i=0; i<2; i++){PSBRootViewController *vc=vcs[i];//让出导航条CGRect frame=self.view.bounds;frame.origin.y += 64;frame.size.height -=64;if (i==0) {vc.view.frame=frame;}else{frame.size.width=frame.size.width/2;frame.origin.x=self.view.bounds.size.width;vc.view.frame=frame;}[self.view addSubview:vc.view];//但是需要注意:如果在ARC下,self.view 只添加了vc.view的话,那么arc会自动释放掉VC。//解决办法://官方视图控制器,提供方法保留子视图控制器。//使当前视图控制器作为容器,子视图控制器不会被释放。其实内部实现也是很简单,就是一个数组,管理着这些子视图控制器,强引用。[self addChildViewController:vc];}}//弹出右侧的抽屉
-(void)popRightDrawer
{if (_isDrawerShow) {return;}[UIView beginAnimations:nil context:NULL];[UIView setAnimationDuration:0.25];//设置动画结束的效果PSBRootViewController *vc1=self.childViewControllers[0];CGRect frame=vc1.view.frame;frame.size.width=frame.size.width/2;vc1.view.frame=frame;PSBRootViewController *vc2=self.childViewControllers[1];frame=vc2.view.frame;frame.origin.x=vc1.view.frame.size.width;vc2.view.frame=frame;[UIView commitAnimations];_isDrawerShow=YES;
}//收起右侧抽屉
-(void)hideRightDrawer
{if (!_isDrawerShow) {return;}[UIView beginAnimations:nil context:NULL];[UIView setAnimationDuration:0.25];//设置动画的效果CGRect frame=self.view.bounds;frame.origin.y +=64;frame.size.height -=64;PSBRootViewController *vc1=self.childViewControllers[0];vc1.view.frame=frame;PSBRootViewController *vc2=self.childViewControllers[1];frame.origin.x=vc1.view.frame.size.width;frame.size.width=self.view.bounds.size.width/2;vc2.view.frame=frame;[UIView commitAnimations];_isDrawerShow=NO;}#pragma mark -- 子视图控制器
//创建子视图控制器
-(void)createChildViewcontrollers
{NSArray *tempArray=@[@"AZFirstViewController",@"AZSecondViewController"];id obj1,obj2;for (NSUInteger i=0; i<tempArray.count; i++){Class cls=NSClassFromString(tempArray[i]);id obj=[[cls alloc] init];if (i) {obj2=obj;}else{obj1=obj;}}//添加到当前容器[self addChildViewControllers:@[obj1,obj2]];
}@end


//选中了一个cell
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{//找到当前视图控制器所在的容器PSBMedicalViewController * mvc = (id)self.parentViewController;[mvc popRightDrawer];
}




这篇关于如何自己写一个容器来实现viewController之间的切换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969156

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand