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

Posted

技术标签:

【中文标题】iphone模式视图-如何返回父父父控制器【英文标题】:iphone modal view - how to go back to parent parent parent controller 【发布时间】:2011-06-22 03:39:07 【问题描述】:

我有几个视图,我以模态方式一个接一个地打开。 View1 调用 View2,View2 调用 View3。 我用这段代码来调用下一个视图:

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

    [self presentModalViewController:myView animated:YES];

    [myView release];

如果用户按下取消按钮,它会返回一个视图... 3 到 2 和 2 到 1

[self.parentViewController dismissModalViewControllerAnimated:YES];

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

我该怎么做?

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

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

    [mainNavController presentModalViewController:screen animated:YES];

    [screen release];

编辑 #2: 主窗口调用视图 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。

【问题讨论】:

【参考方案1】:

为什么不使用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];

【讨论】:

如果我使用 NavController,如何首先调用视图? 你说的是哪种观点? 如果我在视图 1 上并想显示视图 2。上面的代码就是我现在的做法。如果我使用 NavController,那么代码是什么样的? 添加了一些关于使用导航控制器的信息。如果您对答案中的某些问题有疑问,请查看并告诉我。 我猜我需要向 XIB 添加一个 NavController?然后我需要将“Window”附加到.h?在说 self.window.root.... 的行上,它给出了一个错误,说在对象上找不到 Property 'window' ...【参考方案2】:

似乎没有聪明的办法,试试这个笨办法:

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

【讨论】:

会不会发布您正在显示的那个然后停止代码?

以上是关于iphone模式视图-如何返回父父父控制器的主要内容,如果未能解决你的问题,请参考以下文章

当我在 iPhone 的导航栏上单击返回时,如何弹出到所需的视图控制器

高程:执行环境作用域上下文执行过程垃圾收集try...catch...

如何在iphone的子视图页面中创建带有导航返回按钮的导航栏

iPhone 5横向模式下,导航栏右侧的按钮停止工作,如何解决?

iphone sdk:如何正确切换控制器

测试给定的 iPhone 是不是支持展开模式下的拆分视图