ios 页面随意跳转, pop页面随意.出栈入栈,跳转到不是从哪个页面进入的

pop到界面栈中存在的某个界面
对于iOS中的界面栈,我们需要有一个明确的认识。界面不断push的过程,其实就是界面不断入栈的过程,当前显示的界面,就是栈顶界面。界面pop的过程,就是界面不断出栈的过程,出栈后的界面也就不可见了。可见的永远都是栈顶界面。系统默认的返回键或者pop方法都是返回到上一个界面。但是在实际开发中,我们有这样的需求,我们需要pop到隔着好几个界面的前面某个界面,那么应该怎么做呢?

//判断前面有没有SecondViewController,有的话pop到SecondViewController页面,否则不进行跳转  
  NSArray *vcArray = self.navigationController.viewControllers;


    for(UIViewController *vc in vcArray)
    {
        if ([vc isKindOfClass:[SecondViewController class]])
        {
            [self.navigationController popToViewController:vc animated:YES];
        }
    }  

重构界面栈,pop到之前不存在的界面
为什么要重构界面栈?在实际开发中会遇到这样的情况,在某几个界面间是一个死循环,在进行跳转的时候不断在几个界面间push,然后同样一个界面就会在栈中出现很多次,虽然这些栈都是不同的实例,但是这样完全没有必要。栈中界面越来越多,难道不会影响性能吗?并且默认有这样的准则:一个VC在栈中只有一个。所以,在必要时候,我们不要老是push,如果一个界面已经出现过,我们可以尝试pop。甚至没有出现过,我们可以在栈中插入一个界面,然后pop到该界面。这是为了从性能上去考虑,我们要不断维护界面栈。界面栈其实就是一个数组,插入删除操作非常方便,但是同样要提高警惕,容易造成crash

 *  这里的需求是,判断我的界面栈前面有没有FirstViewController,如果有的话,在FirstViewController后面插入一个InsertViewController,然后从当前界面pop到InsertViewController,InsertViewController可以pop到FirstViewController。 

 NSMutableArray *pageArray = [self.navigationController.viewControllers mutableCopy];
    for (int i = 0; i<pageArray.count; i++) {
        id vc = pageArray[i];
        if ([vc isKindOfClass:[ViewController class]]) {
            InserViewController *inser = [[InserViewController alloc] init];
            [pageArray insertObject:inser atIndex:i+1];
           [ self.navigationController setViewControllers:pageArray animated:NO];
            inser.hidesBottomBarWhenPushed = YES;
            [self.navigationController popToViewController:inser animated:YES];


        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,848评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,312评论 4 61
  • 若,说出了就是诺 人生若只如初见 只一句,但又一个凄美的故事 选择无法分清对与错 譬如挖坑埋了一颗种子 许是悄悄刺...
    迁于乔木阅读 221评论 0 0
  • 今天一早小编就被告知了一个令人绝望的消息 柯南长期休载啦!!! 青山刚昌表示:“大家好我是青山刚昌!从下一期开始,...
    路人青城阅读 297评论 0 0
  • 在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段。编译器会将消息发送转换...
    白屏阅读 776评论 0 49