很抱歉,如果之前有人问过这个问题。
我想知道如何处理navigationController堆栈,就像我正在寻找最佳实践一样
现在我正在做的是检查一个viewcontroller是否已经存在,然后在导航堆栈中,然后我通过做这样的事情将其弹回
bool flag = NO;
for(LoginViewController *vc in self.navigationController.viewControllers)
{
if ([vc isKindOfClass:[LoginViewController class]]) {
flag = YES;
}
}
if (flag!=YES ){
LoginViewController *objVC = [[LoginViewController alloc]init];
[self.navigationController pushViewController:objVC animated:YES];
objVC = nil;
}else
{
[self.navigationController popViewControllerAnimated:YES];
}
我是否真的需要在推送之前检查导航堆栈中是否已存在任何viewcontroller,或者导航控制器是否处理它并在某些时候删除未使用的viewcontroller。有没有更好的方法来做到这一点,或者我已经做了正确的事情
简而言之,我们如何阻止视图控制器被推入导航堆栈两次。
答案 0 :(得分:0)
popViewControllerAnimated
将始终弹出堆栈中最顶层的VC。它以LIFO方式运作。
LoginViewController
可能不一定是堆栈中最重要的元素,因此为了删除它,您必须以这种方式修改代码。
LoginViewController *loginVC = nil;
NSUInteger index = [self.navigationController.viewControllers indexOfObjectPassingTest:^BOOL (id obj, NSUInteger idx, BOOL *stop) {
return [obj isKindOfClass:[LoginViewController class]];
}];
if (index != NSNotFound) {
//Found VC on stack
//Get LoginViewController instance
loginVC = [myArray objectAtIndex:index];
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
//Remove LoginViewController obj from stack
[viewControllers removeObjectIdenticalTo:loginVC];
//Reassign new array which does not contain LoginViewController
navigationController.viewControllers = viewControllers;
}
else {
//VC not found on stack
LoginViewController *objVC = [[LoginViewController alloc]init];
[self.navigationController pushViewController:objVC animated:YES];
}
希望有所帮助!