在UINavigationController堆栈中推送viewController的最佳实践

时间:2014-03-21 06:31:43

标签: ios objective-c uinavigationcontroller

很抱歉,如果之前有人问过这个问题。

我想知道如何处理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。有没有更好的方法来做到这一点,或者我已经做了正确的事情

简而言之,我们如何阻止视图控制器被推入导航堆栈两次。

1 个答案:

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

希望有所帮助!