美文网首页
ios 页面随意跳转, pop页面随意.出栈入栈,跳转到不是从哪

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

作者: nihau | 来源:发表于2016-12-14 16:08 被阅读518次

    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];
    
    
            }
        }
    

    相关文章

      网友评论

          本文标题:ios 页面随意跳转, pop页面随意.出栈入栈,跳转到不是从哪

          本文链接:https://www.haomeiwen.com/subject/bzwimttx.html