如何从一个视图控制器跳转到另一个视图控制器

26

我现在使用iOS,有15个ViewController。我想从一个ViewController跳转到另一个ViewController。

我正在使用以下代码:

SecondViewController *Sec=[SecondViewController alloc]init];
[self.navigationController popViewController:Sec animated:YES];

这显示错误 此视图控制器不存在,然后我使用以下代码:

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:1] animated:YES];

此代码可从第三个视图控制器弹出到第二个视图控制器。但是当我们从第九个(9th)视图控制器弹出到第五个(5th)视图控制器时会发生什么,然后我在第九个(9th)视图控制器中使用了这个代码:

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:4] animated:YES];

它不能从第九个(9th)视图控制器跳转到第五个(5th)视图控制器,但可以从第九个(9th)视图控制器跳转到第八个(8th)视图控制器。我不知道在使用这行代码时发生了什么:

NSArray *array = [self.navigationController viewControllers];
NsLog(@"array = %@",array);

当我们在Ninth(第九)ViewController中使用此代码时,NsLog将显示:

array=   First(1st)ViewController;  
         Second(2nd)ViewController;
         Eight(8th)ViewController;
         Ninth(9th)ViewController;

我不知道为什么只显示四个视图控制器。无论我使用多少个视图控制器,这个问题都会在每个视图控制器中出现。例如,如果我从第15个视图控制器弹出到第5个视图控制器,那么同样的问题也会出现。

NSArray *array = [self.navigationController viewControllers];
NsLog(@"array = %@",array);

array=     First(1st)ViewController;  
           Second(2nd)ViewController;
           fourteenth(14th)ViewController;
           fifteenth(15th)ViewController;

我想数一下ViewControllers的数量,然后跳转到特定的ViewController。

2
你确定所有的 ViewControllers 都被推到了 NavigationController 中吗? - talnicolas
8个回答

38

当使用 UINavigationController 时,您无法像在 secondViewController 示例中那样弹出到新的视图控制器。

您可以通过以下方式将控制器添加到堆栈中:

Add Controller

[self.navigationController pushViewController:<yournewViewController> animated:YES];

使用以下方法返回到上一个页面:

[self.navigationController popViewControllerAnimated:YES];

返回到先前的控制器(必须先进行推送):

[self.navigationController popToViewController:<ViewControllerToPopTo> animated:YES];

回到根控制器与

[self.navigationController popToRootViewControllerAnimated:YES];

34
for (UIViewController *controller in self.navigationController.viewControllers)
        {
            if ([controller isKindOfClass:[nameOfYourViewControllerYouWantToNavigate class]])
            {
                [self.navigationController popToViewController:controller animated:YES];

                break;
            }
        }

11

快捷 4.0 - 快捷 5.0

 for controller in self.navigationController!.viewControllers as Array {
            if controller.isKind(of: HomeViewController.self) {
                self.navigationController!.popToViewController(controller, animated: true)
                break
            }
        }

7

试一试

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

5

首先:

 SecondViewController *Sec=[SecondViewController alloc]init];
 [self.navigationController popViewController:Sec animated:YES];

由于您分配了一个不在导航控制器中的新“Sec”视图控制器,因此您无法执行此操作。
请考虑使用以下内容:
您正在第9个视图控制器中。
for (int i= 0 ; i < [[self.navigationController viewControllers]count] ; i++) {
    if ( [[[self.navigationController viewControllers] objectAtIndex:i] isKindOfClass:[FifiViewControllerClassname class]]) {
        [self.navigationController popToViewController:[array objectAtIndex:i] animated:YES];
    }
}

1
尝试像这样。
MyTableViewController *vc = [[MyTableViewController alloc] init];
NSMutableArray *controllers = [NSMutableArray    
arrayWithArray:self.navigationController.viewControllers];
[controllers removeLastObject];
[controllers addObject:vc]; 

1
对于 Swift 3.0,使用 filter:
let desiredViewController = self.navigationController!.viewControllers.filter { $0 is YourViewController }.first!
self.navigationController!.popToViewController(desiredViewController, animated: true)

1
BOOL check = FALSE;
NSArray *viewControllers = [[self navigationController] viewControllers];
id obj;
for( int i=0;i<[viewControllers count];i++)
{
    obj=[viewControllers objectAtIndex:i];
    if([obj isKindOfClass:[yourclassname class]])
    {
        check = TRUE;
        break;
    }
}

if (check)
{

    [[self navigationController] popToViewController:obj animated:YES];
}
else
{
    yourclassname *yourclassnameObj=[self.storyboard instantiateViewControllerWithIdentifier:@"yourclassStoryBoardID"];
    [self.navigationController pushViewController:yourclassnameObj animated:true];

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接