如何从一个视图控制器弹出到另一个视图控制器

Rah*_*rma 21 iphone objective-c uinavigationcontroller uipopovercontroller ios

使用iOS我现在有15个ViewControllers我想从一个ViewController弹出到另一个View Controller.

我正在使用此代码:

SecondViewController *Sec=[SecondViewController alloc]init];
[self.navigationController popViewController:Sec animated:YES];
Run Code Online (Sandbox Code Playgroud)

这显示错误this ViewController not exist,然后我使用此代码:

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:1] animated:YES];
Run Code Online (Sandbox Code Playgroud)

此代码适用于从thirdViewController弹出到secondViewController.但是当我们从第九个(第9个)ViewController弹出到第五个(第五个)ViewController然后我在第九个(第9个)ViewController中使用这个代码时发生了什么:

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:4] animated:YES];
Run Code Online (Sandbox Code Playgroud)

它不会从Ninth(第9个)ViewController弹出到第五个(第五个)ViewController,它将第九个(第9个)ViewController弹出到第八个(第8个)ViewController.我不知道当我们使用这条线时发生了什么:

NSArray *array = [self.navigationController viewControllers];
NsLog(@"array = %@",array);
Run Code Online (Sandbox Code Playgroud)

当我们使用它时Ninth(9th)ViewController.NsLog显示:

array=   First(1st)ViewController;  
         Second(2nd)ViewController;
         Eight(8th)ViewController;
         Ninth(9th)ViewController;
Run Code Online (Sandbox Code Playgroud)

我不知道为什么只有四个视图控制器显示.每当我使用15个视图控制器时.每个视图控制器中都会出现此问题.例如,如果我使用pop形式第十五(15)ViewController到Fifth(5th)ViewController然后相同的问题清单.

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

array=     First(1st)ViewController;  
           Second(2nd)ViewController;
           fourteenth(14th)ViewController;
           fifteenth(15th)ViewController;
Run Code Online (Sandbox Code Playgroud)

我想计算ViewControllers的数量,然后弹出到特定的ViewController.

Eri*_*net 36

您无法弹出到新的视图控制器(就像使用secondViewController示例一样).

当你使用UINavigationController时

将Controller添加到堆栈中:

[self.navigationController pushViewController:<yournewViewController> animated:YES];
Run Code Online (Sandbox Code Playgroud)

弹出到上一个:

[self.navigationController popViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

弹出到堆栈中的前一个控制器(必须先被推送):

[self.navigationController popToViewController:<ViewControllerToPopTo> animated:YES];
Run Code Online (Sandbox Code Playgroud)

返回到根控制器

[self.navigationController popToRootViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)


KDe*_*kar 31

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

                break;
            }
        }
Run Code Online (Sandbox Code Playgroud)


小智 7

试试这个

 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
Run Code Online (Sandbox Code Playgroud)


小智 5

第一:

 SecondViewController *Sec=[SecondViewController alloc]init];
 [self.navigationController popViewController:Sec animated:YES];
Run Code Online (Sandbox Code Playgroud)

您无法执行此操作,因为您分配了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];
    }
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*nit 5

Swift 4.0-Swift 5.0

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