iOS 怎么在多次presentViewController后直接返回到最底层界面

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进行记录操作,调用appDelegate单例设置一个属性记录当前视图控制器,然后对于需要进行present操作的视图控制器,继承于BaseViewController,那么每次present一个新的视图控制器,父视图控制器的viewWillAppear方法都会被执行:

-(void)viewWillAppear:(BOOL)animated{  
  
    AppDelegate *delegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];  
    delegate.presentingController = self;    
} 

在appDelegate.h文件里面添加一个属性 presentingController,来记录当前视图控制器,注意这里的属性名并不是presentingViewController,不要搞混了。

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

- (void)clickButton:(id)sender {  
      
    AppDelegate *appDele = (AppDelegate *)[UIApplication sharedApplication].delegate;
    if (appDele.presentingController){
        UIViewController *vc = appDele.presentingController.presentingViewController;
        if (vc.presentingViewController){
            //循环获取present出来本视图控制器的视图控制器(简单一点理解就是上级视图控制器),一直到最底层,然后在dismiss,那么就ok了!
            while (vc.presentingViewController){
                vc = vc.presentingViewController;
            }
            [vc dismissViewControllerAnimated:YES completion:nil];
        }
    } 
}  

转自:http://blog.csdn.net/longshihua/article/details/51282388

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值