如何知道视图控制器是否在堆栈中。如果它在堆栈中应该弹出,否则应该被推送

时间:2013-03-08 10:19:07

标签: iphone ios ipad

我在下拉列表中有4个视图控制器。当我从下拉列表中选择一个视图控制器时,如果视图控制器已经在堆栈中(即已经被推入),则应该弹出或推送它。

6 个答案:

答案 0 :(得分:3)

for (UIViewController*vc in [self.navigationController viewControllers]) {
if ([vc isKindOfClass: [TestViewController class]]){

[[self navigationController] popToViewController:vc animated:YES];
  }
}

答案 1 :(得分:1)

如果在NavigationController中可以出现类“ViewController”的相同实例,那么这将更好用

-(void)gotoViewController:(id )viewController
{
    if ([self.navigationController.viewControllers containsObject:viewController])
    {
        [self.navigationController popToViewController:viewController animated:YES];
    }
    else
    {
        [self.navigationController pushViewController:viewController animated:YES];
    }
}

答案 2 :(得分:0)

NSInteger index = -1;
NSArray* arr = [[NSArray alloc] initWithArray:self.navigationController.viewControllers];
NSLog(@"View list=== %@",arr);
for(int i=0 ; i<[arr count] ; i++)
{
        if([[arr objectAtIndex:i] isKindOfClass:NSClassFromString(@"ViewContollerName")])
        {
            index = i;
        }        
}
[self.navigationController popToViewController:[arr objectAtIndex:index] animated:YES];

答案 3 :(得分:0)

您只需检查要推送或弹出的viewcontroller上的navigationController属性即可。如果vc在导航堆栈上,则设置此属性,如果不在,则设置nil。这样可以避免迭代遍历堆栈上的所有vcs并进行丑陋的类测试。

假设您想知道导航控制器堆栈上是否有theVC,您可以这样做:

if (theVC.navigationController == nil)
    //push the vc on the nav stack
else
    //pop the vc from the nav stack

答案 4 :(得分:0)

我建议更好地维护一个数组。你只需要维护Navigated控制器的关键字,这就是你如何添加逻辑不合实的对象,所以要相应地理解它

检索时检查对象是否在数组中,如果是则弹出它。当poped从堆栈中移除它,否则推它

答案 5 :(得分:-1)

试试这个:

UIViewController *currentView = [[UIViewController alloc] init];
currentView = [navigationController.visibleViewController retain];
if (![currentView isMemberOfClass:[YourViewController class]])
{
    //push
}

else
{
    //pop
}
[currentView release];

注意:如果您使用ARC,请进行调整。

确保引用正确的navigationController