在iOS中返回根视图

4

对某些人来说,这可能听起来像一个愚蠢的问题。我在搜索时找到的相关信息比较少,主要是因为我无法找到适当的搜索词。

以下是我的需求:

应用程序从视图A开始。

视图A启动视图B,视图B又启动视图C。

是否有一种方法可以使视图C直接返回到A,而不会解除自身并暴露B。例如,一个主菜单按钮。

2个回答

11

如果你有一个UINavigationController,可以调用popToRootViewControllerAnimated:。如果将动画参数指定为NO,则将直接跳回根视图而不显示B。


我正在尝试在主菜单按钮触发的IBAction事件存根中使用[self.navigationController popToRootViewControllerAnimated:NO];。它似乎没有任何效果,但可以执行而不会引发错误。 - Andrew S
好的,首先问题是你是否有一个UINavigationController并将你的视图(通过它们自己的视图控制器)推入堆栈?每个视图控制器都有一个navigationController属性,但它可能被设置为nil。 - Magic Bullet Dave
请查看http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html,看看这是否是您想要复制的效果。 - Magic Bullet Dave
我只想能够返回到堆栈中的第一个视图,即应用程序的主菜单。我希望所有的视图都有一个“主菜单”按钮来方便这个操作。 - Andrew S
哦,是的,我正在将模态视图控制器叠加在彼此之上。 - Andrew S
显示剩余6条评论

1

我已经找到了解决问题的方法。虽然有点不太规范(可能会被批评),但在测试中表现良好,实现起来也非常快速。以下是我的做法。

在我的应用程序中,我有一个名为GlobalVars的单例类(我用它来存储各种全局设置)。这个类包含一个名为home_pressed的布尔值和相关的访问器(通过synthesize实现)。如果您愿意,您也可以将此值存储在应用程序委托中。

在每个带有主菜单按钮的视图控制器中,我将按钮连接到homePressed IBAction方法,如下所示。首先将全局的homePressed布尔值设置为YES,然后以通常的方式关闭视图控制器,但不使用动画效果。

-(IBAction) homePressed: (id) sender
{
   [GlobalVars _instance].homePressed = YES;
   [self dismissModalViewControllerAnimated: NO];
}//end homePressed

在除了主菜单之外的每个视图控制器中,我都会实现viewDidAppear方法(当视图重新出现时调用)如下。
-(void) viewDidAppear: (Bool) animated
{
   if ([GlobalVars _instance].homePressed == YES)
   {
      [self dismissModalViewController: NO];
   }
   else
   {
      //put normal view did appear code here/
   }

}//end viewDidAppead

在应用程序的根视图控制器mainMenu中,我在其view did appear方法中将全局布尔变量homePressed设置为NO,如下所示。
-(void) viewDidAppear: (Bool) animated
{
   if ([GlobalVars _instance].homePressed == YES)
   {
      [GlobalVars _instance].homePressed == NO;
   }
   else
   {
      //put normal view did appear code here/
   }

}//end viewDidAppear

这样做可以让我从任何下层视图返回应用程序的根主菜单。

我本来希望避免使用这种方法,但如果我想使用UINavigationController解决方案,那我就必须重新实现我的应用程序,所以这还是更好的选择。

很简单,在我的9个视图应用程序中只花了我10分钟来编码。 :)

最后一个问题,我的解决方案是否符合HIG?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接