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

时间:2011-06-22 03:39:08

标签: iphone modal-dialog modalviewcontroller

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

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

    [self presentModalViewController:myView animated:YES];

    [myView release];

如果用户按下取消,则返回一个View ... 3到2和2到1

[self.parentViewController dismissModalViewControllerAnimated:YES];

我需要做的是当用户在View3上时,如果他们没有选择取消但完成操作,那么我需要返回View1并释放View2和View3。

我该怎么做?

编辑:MAIN WINDOW有一个Navcontroller和6个视图控制器。我将View 1称为

View1 *screen = [[View1 alloc] initWithNibName:@"View1" bundle:[NSBundle mainBundle]];
    self.Search = screen;

    [mainNavController presentModalViewController:screen animated:YES];

    [screen release];

编辑#2: 主Windows调用视图1.主窗口在XIB中有一个NavController,它可以工作:

    View1 *screen = [[View1 alloc] initWithNibName:@"View1" bundle:[NSBundle mainBundle]];


[mainNavController presentModalViewController:screen animated:YES];

[screen release];

然后在View 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。

2 个答案:

答案 0 :(得分:5)

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

如果你这样做,

[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

你应该回到1

摘自dismissModalViewControllerAnimated

如果连续呈现多个模态视图控制器,从而构建一组模态视图控制器,则在堆栈下方的视图控制器上调用此方法会解除其直接子视图控制器以及该子视图上方的所有视图控制器在堆栈上。发生这种情况时,只有最顶层的视图以动画方式被删除;任何中间视图控制器都可以从堆栈中删除。最顶层的视图使用其模态过渡样式被忽略,这可能与堆栈中较低的其他视图控制器使用的样式不同。

使用导航控制器

要使导航控制器正常工作,而不是按照您的view1加载,

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

[mainNavController presentModalViewController:navController animated:YES];

这假设view1rootViewController

设置完导航控制器后,您可以像这样加载view2

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];

答案 1 :(得分:0)

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

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