iOS – 在导航堆栈中显示一个视图控制器

Posted

技术标签:

【中文标题】iOS – 在导航堆栈中显示一个视图控制器【英文标题】:iOS – Showing a view controller already in the navigation stack 【发布时间】:2012-02-10 12:51:51 【问题描述】:

这可能很容易排序,但我无法弄清楚。我有一个带有两个标签的标签栏应用程序,每个标签都有一个UINavigationController

假设我在选项卡 1 中推送了一个名为 ItemViewController 的视图控制器,然后我转到选项卡 2。从选项卡 2 我想以编程方式显示 ItemViewController。所以它应该先把我带到标签1,然后显示ItemViewController

只需点击选项卡 1 选项卡项即可轻松实现,但出于其他原因,我想以编程方式执行此操作。

我现在正在做什么来实现这一目标:

[tab1NavController popToRootViewControllerAnimated:NO];
[tabBarController setSelectedIndex:0];
[tab1NavController pushViewController:itemViewController animated:NO];

我希望能够用伪代码做这样的事情:

if(viewControllerIWantToDisplayIsOnNavStack)
[tab1NavController presentViewController:viewControllerIWantToDisplay];
else
//instantiate and pushviewcontroller onto stack

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:
// check if the desired controller is on the stack in tab 1
if([[tab1NavController viewControllers] containsObject:viewControllerIWantToDisplay]) 
    // desired controller is on the stack, let's see if it's on top
    if(tab1NavController.topViewController == viewControllerIWantToDisplay) 
        // no need to do anything
        
    else 
        // we need to pop to the desired view controller
        [tab1NavController popToViewController:viewControllerIWantToDisplay animated:NO];
    
 else 
    // desired controller not on the stack
    [tab1NavController pushViewController:viewControllerIWantToDisplay animated:NO];

因此您不必再在标签 1 中弹出到根视图控制器。

【讨论】:

我从哪里得到对viewControllerIWantToDisplay的引用? 你需要在某个地方保留对它的引用,我建议 appDelegate 类,它在整个应用程序中都很容易访问。或者,如果您确定tab1NavController 上只有一个viewControllerIWantToDisplay,那么更好的方法可能是检查类的类型,就像 BobDev 建议的那样。但在这种情况下,您必须检查 viewControllers 的整个数组才能找到您的控制器。【参考方案2】:

对我来说,以下方式有效,我使用循环检查类是否在堆栈数组中

 NSInteger viewControllersCount = 0;
    UIViewController *rootViewController = nil;
    Yourcontroller *viewController = nil;

    NSArray *viewControllers = self.navigationController.viewControllers;

    viewControllersCount = viewControllers.count - 1;

    for (int i = viewControllersCount ; i > 0 ; i--) 
        rootViewController = [viewControllers objectAtIndex:i];
        if([rootViewController isKindOfClass:[Yourcontroller class]])
        
            viewController = (NWAAccountViewC *)rootViewController;
            [self.navigationController popToViewController:rootViewController animated:YES];
            break;
        

    

【讨论】:

【参考方案3】:

以编程方式选择另一个选项卡非常容易,只需这样做:

tabbarcontroller.selectedIndex = tabNr;

但我看你已经知道了。您可以通过如下检查来检查堆栈上的顶部视图控制器是否是您需要的视图控制器类型:

if([navigationcontroller.topviewcontroller isKindOfClass:[Yourcontroller class]])

    //change tabbar or something else

【讨论】:

以上是关于iOS – 在导航堆栈中显示一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

iOS UINavigationController - 从导航堆栈中删除视图控制器确实会释放它

斯威夫特/iOS。从导航堆栈中删除几个视图控制器

Ios 导航 - 自定义后退按钮或从堆栈中删除视图控制器?

屏幕左侧的 UIButton(在 iOS 7 导航滑动区域中)未突出显示

显示一个已经在导航堆栈上的视图控制器

推送导航控制器堆栈后视图不显示