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

Iphone 如何从一个视图控制器弹出到另一个视图控制器,iphone,ios,objective-c,uinavigationcontroller,uipopovercontroller,Iphone,Ios,Objective C,Uinavigationcontroller,Uipopovercontroller,使用iOS,我现在有15个视图控制器,我想从一个视图控制器弹出到另一个视图控制器 我正在使用以下代码: SecondViewController *Sec=[SecondViewController alloc]init]; [self.navigationController popViewController:Sec animated:YES]; NSArray *array = [self.navigationController viewControllers]; [self.navi

使用iOS,我现在有15个视图控制器,我想从一个视图控制器弹出到另一个视图控制器

我正在使用以下代码:

SecondViewController *Sec=[SecondViewController alloc]init];
[self.navigationController popViewController:Sec animated:YES];
NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:1] animated:YES];
这显示错误
此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];
此代码可以从thirdViewController弹出到secondViewController。但是当我们从第九(9)个ViewController弹出到第五(5)个ViewController时发生了什么,然后我在第九(9)个ViewController中使用以下代码:

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:4] animated:YES];
它不会从第九(9)个ViewController弹出到第五(5)个ViewController,而是从第九(9)个ViewController弹出到第八(8)个ViewController。我不知道我们使用这条线路时发生了什么:

NSArray *array = [self.navigationController viewControllers];
NsLog(@"array = %@",array);
当我们在
第九(9)视图控制器中使用此选项时
。NsLog显示:

array=   First(1st)ViewController;  
         Second(2nd)ViewController;
         Eight(8th)ViewController;
         Ninth(9th)ViewController;
我不知道为什么只有四个视图控制器显示。每当我使用15个视图控制器时。此问题发生在每个视图控制器中。例如,如果我使用从第十五(15)个ViewController到第五(5)个ViewController的pop表单,那么同样的问题也会出现

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

array=     First(1st)ViewController;  
           Second(2nd)ViewController;
           fourteenth(14th)ViewController;
           fifteenth(15th)ViewController;
我想数一数ViewController的数量,然后跳到特定的ViewController。

像这样试试

MyTableViewController *vc = [[MyTableViewController alloc] init];
NSMutableArray *controllers = [NSMutableArray    
arrayWithArray:self.navigationController.viewControllers];
[controllers removeLastObject];
[controllers addObject:vc]; 
第一:

您无法执行此操作,因为您分配了不在导航控制器中的新
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];
    }
}
for(int i=0;i<[[self.navigationController viewControllers]计数];i++){
如果([[[self.navigationController viewControllers]objectAtIndex:i]是类:[fififiviewcontrollerclassname类]]){
[self.navigationController popToViewController:[array objectAtIndex:i]动画:是];
}
}

您不能弹出到新的视图控制器(就像您在第二个视图控制器示例中所做的那样)

当使用UINavigationController时

使用以下命令将控制器添加到堆栈中

[self.navigationController pushViewController:<yournewViewController> animated:YES];
弹出到堆栈中的上一个控制器(之前必须已推送):

试试这个

 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
BOOL check=FALSE;
NSArray*ViewController=[[self-navigationController]ViewController];
id-obj;

对于(int i=0;i,对于Swift 3.0,使用过滤器:

let desiredViewController = self.navigationController!.viewControllers.filter { $0 is YourViewController }.first!
self.navigationController!.popToViewController(desiredViewController, animated: true)

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
            }
        }

您确定所有ViewController都已推送到NavigationController吗?
 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
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];

}
let desiredViewController = self.navigationController!.viewControllers.filter { $0 is YourViewController }.first!
self.navigationController!.popToViewController(desiredViewController, animated: true)
 for controller in self.navigationController!.viewControllers as Array {
            if controller.isKind(of: HomeViewController.self) {
                self.navigationController!.popToViewController(controller, animated: true)
                break
            }
        }