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