iphone模态视图-如何返回到父控制器

iphone模态视图-如何返回到父控制器,iphone,modal-dialog,modalviewcontroller,Iphone,Modal Dialog,Modalviewcontroller,我有几个观点,我一个接一个地打开。View1调用View2,View2调用View3。 我使用此代码调用下一个视图: View2 *myView = [[View2 alloc] initWithNibName:@"View2" bundle:[NSBundle mainBundle]]; [self presentModalViewController:myView animated:YES]; [myView release]; 如果用户按cancel,则返

我有几个观点,我一个接一个地打开。View1调用View2,View2调用View3。 我使用此代码调用下一个视图:

   View2 *myView = [[View2 alloc] initWithNibName:@"View2" bundle:[NSBundle mainBundle]];   

    [self presentModalViewController:myView animated:YES];

    [myView release];
如果用户按cancel,则返回一个视图…3到2和2到1

[self.parentViewController dismissModalViewControllerAnimated:YES];
我需要做的是,当用户在View3上时,如果他们没有选择“取消”,但完成了操作,那么我需要返回View1并释放View2和View3

我该怎么做

编辑:主窗口有一个导航控制器和6个视图控制器。我这样称呼视图1:

编辑2: 主窗口调用视图1。主窗口在XIB中有一个导航控制器。此功能:

然后在视图1上的XIB中,我添加了一个NavController,并将其绑定到.h中的View1NavController

视图1然后调用视图2:

   View2 *myView = [[[View2 alloc] initWithNibName:@"View2" bundle:nil] autorelease];

UINavigationController * navController = [[[UINavigationController alloc] initWithRootViewController:myView] autorelease]; 

[View1NavController presentModalViewController:navController animated:YES];
当我执行此操作时,没有错误,但它不会显示View2。

为什么不使用UINavigationController?您可以同时使用popToRootViewControllerAnimated:和popViewControllerAnimated:

如果你这样做

[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];
你应该回到1

摘自

如果连续显示多个模态视图控制器,从而构建模态视图控制器堆栈,则在堆栈中较低的视图控制器上调用此方法将取消其直接子视图控制器和堆栈中该子视图控制器上方的所有视图控制器。当这种情况发生时,只有最上面的视图以动画方式被取消;只需从堆栈中删除任何中间视图控制器。最上面的视图使用其模式转换样式关闭,该样式可能与堆栈中较低的其他视图控制器使用的样式不同

使用导航控制器

要使导航控制器正常工作,您将不在加载视图的位置1执行此操作

View1 *myView = [[[View1 alloc] initWithNibName:@"View1" bundle:nil] autorelease]; 
UINavigationController * navController = [[[UINavigationController alloc] initWithRootViewController:myView] autorelease]

[mainNavController presentModalViewController:navController animated:YES];
这是假设view1是rootViewController

一旦设置了导航控制器,就可以像这样加载view2

View2 *myView = [[View2 alloc] initWithNibName:@"View2" bundle:[NSBundle mainBundle]];   
[self.navigationController pushViewController:myView animated:YES];
[myView release];
在这种情况下,

取消

完整的


似乎没有聪明的方法,试试这个愚蠢的方法:

  UIViewController *vc = self;
  while(vc.parentViewController.modalViewController == vc){
    [[vc retain] autorelease];
    [vc dismissModalViewControllerAnimated:NO];
    vc = vc.parentViewController;
  }

如果我使用NavController,我首先要如何调用视图?你说的是哪个视图?如果我在视图1上,想显示视图2。上面的代码就是我现在如何做到的。如果我使用导航控制器,那么代码是什么样子的?添加了一些关于使用导航控制器的内容。请看一看,如果您对答案中的某些内容有疑问,请告诉我。我想我需要向XIB添加一个导航控制器吗?然后我需要将窗口连接到.h?在写self.window.root的行上。。。。它给出了一个错误,说在对象上找不到属性“window”…难道这不会释放您正在显示的属性,然后停止代码吗?
View2 *myView = [[View2 alloc] initWithNibName:@"View2" bundle:[NSBundle mainBundle]];   
[self.navigationController pushViewController:myView animated:YES];
[myView release];
[self.navigationController popViewControllerAnimated:YES];
[self.navigationController popToRootViewControllerAnimated:YES];
  UIViewController *vc = self;
  while(vc.parentViewController.modalViewController == vc){
    [[vc retain] autorelease];
    [vc dismissModalViewControllerAnimated:NO];
    vc = vc.parentViewController;
  }