如何自己写一个容器来实现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

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal