在导航控制器中的视图之间跳转

时间:2013-02-21 15:16:38

标签: ios xcode uinavigationcontroller

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

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

当用户输入应用时,应用会转到View1-> View2(下载内容) - >查看3-> View4-> View5 然后用户希望转到第一个应用程序屏幕(View3),他执行:

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

用户第一次进入应用程序时:View1-> View3(不再需要下载屏幕),我有不同的推送segue转到View3所以我们假设用户转到:View1->查看3-> View4-> View5,现在他希望回到View3,所以功能:

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

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

8 个答案:

答案 0 :(得分:2)

如果您使用的是故事板,那么您可以做的就是设置您的uiviewcontrollers'故事板ID,用它来弹出和推动你的观点。

enter image description here

让我们说你的故事板名称是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和view2 {{ 1}},

当你完成它们时,我们可以说;用户成功加载应用程序关闭徽标屏幕,present them as Modal View Controllers如果下载成功则解除它。

所以你的View3将作为root视图控制器存在,让我们说你想在View(n)你想要进入主屏幕View3所有你需要做的就是打电话

present Download Screen

当您在[self.navigationController popToRootViewControllerAnimated:NO]; 时,想要弹出view(n)只需使用

view(n-1)
祝你好运,

答案 1 :(得分: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]

答案 2 :(得分:0)

在第二个序列中,您的导航堆栈会更改,而view3将在索引1处。

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

将是正确的做法。

答案 3 :(得分:0)

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

尝试删除从视图1转换的segue>在没有动画的情况下,查看3并将用户推过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

答案 4 :(得分: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];
    }
}

这很简单,有效!

答案 5 :(得分:0)

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

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

for (UIViewController *viewController in self.navigationController.viewControllers) {
        if([viewController isKindOfClass:["your ViewController" class]]) {
            [self.navigationController popToViewController:viewController animated:NO];
        }
    }

答案 6 :(得分:0)

for (UIViewController* controller in self.navigationController.viewControllers) {
        if ([controller isKindOfClass:[<Your View Controller Name> class]]) {
            [self.navigationController popToViewController:controller animated:YES];
            return;
        }
    }

答案 7 :(得分:-1)

像这样对待特定的视图控制器

  [self.navigationController popToViewController:[[self.navigationController viewControllers]objectAtIndex:1] animated:YES];