3

我需要在视图控制器之间跳转。例如:

View1: First screen (Just logo)
View2: Download Screen
View3: First app screen (Some Buttons)
View4-View(N): some app screens

当用户进入应用程序时,应用程序转到 View1->View2(下载东西)->View 3->View4->View5 然后用户希望转到第一个应用程序屏幕(View3),他这样做:

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:NO];

用户第一次进入应用程序时:View1->View3(不再需要下载屏幕),我有不同的推送序列可以转到 View3,所以假设用户转到:View1->View 3->View4- >View5,现在他想回到View3,所以函数:

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:NO];

将他送回 View4,这是错误的。我该如何解决?

4

8 回答 8

2

好吧,如果您使用 storyboards ,您可以做的是设置您的 uiviewcontrollers 的故事板 ID 并将其用于弹出和推送您的视图。

在此处输入图像描述

假设您的故事板名称是MainStoryboard.storyboard

UIStoryboard*  sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                  bundle:nil];
SettingsListViewController *settingsVC = [sb instantiateViewControllerWithIdentifier:@"SettingsListViewController"]; // @"SettingsListViewController" is the string you have set in above picture
[self.navigationController popToViewController:settingsVC animated:YES];

上面的解决方案应该对你有用,但如果我是你,我会改变我的应用程序的结构,你说:

View1: First screen (Just logo)
View2: Download Screen

由于 View1 只是徽标,而 View 2 也是您跳过的视图,因此您可以将它们从导航控制器中删除,并使 View3 成为您的导航控制器root view controller,当您需要 view1 和 view2present them as Modal View Controllers时,

当你完成它们时,让我们说;用户成功加载应用程序关闭徽标屏幕,present Download Screen如果下载成功则关闭它。

因此,您的 View3 将作为根视图控制器存在,假设您在 View(n) 处想要转到主屏幕,即 View3,您需要做的就是调用

[self.navigationController popToRootViewControllerAnimated:NO];

当您打开view(n)并想要弹出以view(n-1)使用时

[self.navigationController popViewControllerAnimated:YES];

祝你好运,

于 2013-02-21T16:05:35.173 回答
0

如果我理解正确,你的 view3 有特殊的视图控制器,所以你可以使用这样的代码:

NSArray *VCs = [self.navigationController viewControllers];
for (UIViewController *VC in VCs)
{
    if ([VC isKindOfClass:[**YOUR-VIEW-CONTROLLER** class]]) {
        [self.navigationController popToViewController:VC animated:NO];
    }
}

这很简单而且有效!

于 2013-07-25T18:26:21.317 回答
0

听起来 View 2 没有在运行时添加到您的视图控制器数组中,可能是因为您创建了 segue。

尝试删除从 View 1 > View 3 转换的 segue 并将用户推过 View 2 而无需动画,因为您的应用程序的逻辑需要它:

// If the user needs to skip ahead to view 3, conditionally push view 2 and view 3 without animating
[self.navigationController pushViewController:viewController2 animated:NO];
[self.navigationController pushViewController:viewController3 animated:NO];

或者,如果您将 segue 留在原地,您是否可以不查看UINavigationController viewControllers属性的大小并根据大小“猜测”您是否跳过 View 2?如果你这样做了,那么你可以调整popToViewController方法以弹出正确的索引。如果您还需要跳过其他视图,这无疑是不那么优雅和脆弱的。

// Check length of viewController array with 'N' views (pseudo code)
if (self.navigationController.viewControllers.length == N-1)
    // View 2 was ignored: pop to objectAtIndex:1
else 
    // View 2 was included: pop to objectAtIndex:2
于 2013-02-21T16:13:15.503 回答
0

根据您的位置,直接使用 viewController 的名称

创建您的 viewController 的实例,像这样我在这里假设您的 viewController 名称是-view3Controller

  View3Controller view3Controller=[[View3Controller alloc]init];
 [self.navigationController popToViewController:@"view3Controller" animated:NO]

或者如果您正在使用情节提要,那么

View3Controller view3Controller=[self.storyboard instantiateViewControllerWithIdentifier:@"view3Controller"];

        [self.navigationController popToViewController:@"view3Controller" animated:NO]
于 2013-02-21T15:21:39.497 回答
0

在第二个序列中,您的导航堆栈更改并且 view3 将位于索引 1。所以

[[self.navigationController popToViewController:[array objectAtIndex:1] animated:NO];

将是这样做的正确方法。

于 2013-02-21T15:36:10.153 回答
0

我总是使用它,它会在你的情况下正常工作。事实上,以下代码行被复制到我的“Notes”中以便快速复制/粘贴。

如果没有,请务必导入您的 ViewController.h 文件。

for (UIViewController *viewController in self.navigationController.viewControllers) {
        if([viewController isKindOfClass:["your ViewController" class]]) {
            [self.navigationController popToViewController:viewController animated:NO];
        }
    }
于 2015-10-20T10:51:22.270 回答
0
for (UIViewController* controller in self.navigationController.viewControllers) {
        if ([controller isKindOfClass:[<Your View Controller Name> class]]) {
            [self.navigationController popToViewController:controller animated:YES];
            return;
        }
    }
于 2016-08-23T08:56:08.357 回答
-1

像这样转到特定的视图控制器

  [self.navigationController popToViewController:[[self.navigationController viewControllers]objectAtIndex:1] animated:YES];
于 2015-02-05T09:59:28.630 回答