iOS连续dismiss几个ViewController的方法

原文链接:http://blog.csdn.net/longshihua/article/details/51282388

presentViewController是经常会用到的展现ViewController的方式,而显示和去除presentViewController也是很简单的,主要是下面两个方法:

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completionNS_AVAILABLE_IOS(5_0);

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^__nullable)(void))completionNS_AVAILABLE_IOS(5_0);

但是有的时候我们的需求很特殊,比如在一个presentViewController里要present另一个viewController,甚至再present一个viewController,然后可能在某个时候APP发出一条消息,需要一下子dismiss掉所有的viewController,回到最开始的视图控制器,这时候该如何办呢?下面一起来看看解决办法?

首先,必须知道现在整个APP最顶层的ViewController是哪个,我的做法是建立一个父视图控制器,称为BaseViewController,然后在该视图控制器的viewWillAppear进行记录操作,使用视图控制器的presentingViewController属性记录当前视图控制器,然后对于需要进行present操作的视图控制器,继承于BaseViewController,那么每次present一个新的视图控制器,父视图控制器的viewWillAppear方法都会被执行:

-(void)viewWillAppear:(BOOL)animated{  

    AppDelegate *delegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];
    delegate.presentingController = self;
}  

最后,在需要处理时间的地方(如:点击事件),在点击事件的方法中加入如下代码,即可回到最初视图控制器显示页面:

- (void)clickButton:(id)sender {  

    AppDelegate *delegate=(AppDelegate *)[[UIApplicationsharedApplication]delegate];  

    if (delegate.presentingController)
    {
        UIViewController *vc =self.presentingViewController;  

        if ( !vc.presentingViewController )   return;  

        //循环获取present出来本视图控制器的视图控制器(简单一点理解就是上级视图控制器),一直到最底层,然后在dismiss,那么就ok了!
        while (vc.presentingViewController)
        {
            vc = vc.presentingViewController;
        }  

        [vc dismissViewControllerAnimated:YEScompletion:^{  

        }];
    }
} 

属性解析:

presentedViewController:The view controller that is presented by this view controlller(read-only),被本视图控制器present出来的的视图控制器(只读)

presentingViewController:The view controller that presented this view controller. (read-only),present出来本视图控制器的视图控制器(只读)

时间: 2024-12-15 05:34:08

iOS连续dismiss几个ViewController的方法的相关文章

iOS对UIViewController生命周期和属性方法的解析

目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实例的传值陷阱 四.UIViewController与StroyBoard的相关相互方法 1.ViewController直接在StoryBoard中进行跳转的传值 2.使用代码跳转Storyboard中的controller 五.UIViewController之间的一些从属关系 1.parentV

【iOS开发】iOS对UIViewController生命周期和属性方法的解析

iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有条有理的展示在我们的View层上.iOS中的UIViewController是UIKit框架中最基本的一个类.从第一个UI视图到复杂完整项目,都离不开UIViewController作为基础.基于UIViewController的封装和扩展,也能够出色的完成各种复杂界面逻辑.这篇博客,旨在讨论UIV

iOS开发之删除过期Provisioning Profiles方法

2014-05-15 22:02 by Jeff Li 前言 系列文章:[传送门] 马上快要期末考试了,为了学点什么.就准备这系列的博客,记录复习的成果. 正文-计数  概率 概率论研究随机事件.它源于赌徒的研究.即使是今天,概率论也常用于赌博.随机事件的结果是否只凭运气呢?高明的赌徒发现了赌博中的规律.尽管我无法预知事件的具体结果,但我可以了解每种结果出现的可能性.这是概率论的核心. "概率"到底是什么?这在数学上还有争议."频率派"认为概率是重复尝试多次,某种结

IOS开发隐藏键盘的4种方法

IOS开发隐藏键盘的4种方法 开发的app中常会用到键盘输入完成后隐藏键盘的情况.在此总结了4种方法来实现我们的目的. 方法一--delegate方式 第一种隐藏键盘的方法,称为delegate三步法: 1. 遵循(委托/代理); 2. 调用; 3. 关联头文件(ViewController.h)中遵循代理 . 代码如下: #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITextFieldDel

iOS 7 :代码解决ViewController的View整体上移的问题

解决iOS7视图控制器的View整体上移20个像素 当我们在使用Xcode5创建一个新的项目的时候,我们会发现之前运行在iOS6上面的App整体的视图都向上移动了20个像素点,因为 iOS 7 把整个屏幕高度(包括状态栏和导航栏)都作为了视图控制器的有效高度,于是iOS6上的控制器视图和上面的状态栏交叠在一起了. 关于这个问题,我们的解决方法: 苹果在升级到ios7的时候已经考虑到控制器视图整体上移的这个问题,于是就在iOS7 SDK中为视图控制器添加了一个新的属性edgesForExtende

iOS之Container View获取ViewController

最近使用Container View来在主View Controller建立自己的子Controller,可是遇到问题,不知道如何用代码获取Controller View附带的View Controller. 本想获取了其附带的View Controller,在里面设置代理,然后再主View Controller中实现代理方法,找了很多资料,解决方案如下. 建立一个.h与.m文件,使其关联Container view附带的View Controller,在里面设置代理. 点击Segue,设置Id

【转】IOS 输入框被键盘遮盖的解决方法

做IOS开发时,难免会遇到输入框被键盘遮掩的问题.上网上搜索了很多相关的解决方案,看了很多,但是由衷的觉得太麻烦了. 有的解决方案是将视图上的所有的东西都添加到一个滚动视图对象( UIScrollView )中,然后滚动视图实现输入框不被软键盘覆盖,个人觉得此方案好是好,但是太过麻烦. 有的解决方案是通过一个通知 UIKeyboardDidShowNotification去实现的,需要用到事件监听,而且需要自己定义并实现“将要开始编辑”与“结束编辑”这两个监听事件中的方法.本人也觉得很麻烦. 参

【IOS】读取、保存图片的各种方法

一.读取图片 1.从资源(resource)读取 1 UIImage* image=[UIImage imageNamed:@"1.jpg"]; 2.从网络读取[最好使用EGOImageView来获取网络图片] 1 NSURL *url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"]; 2 UIImage *imgFrom

iOS 在object-c 中调用c文件 方法

1,新建c 头文件  lib.h 定义 c 函数 2,新建 c 实现文件,新建模板选中 c File  lib.c 3,oc 中调用,引用 c 头文件 lib.h ok .搞定 iOS 在object-c 中调用c文件 方法,布布扣,bubuko.com