对某些人来说,这可能听起来像一个愚蠢的问题。我在搜索时找到的相关信息比较少,主要是因为我无法找到适当的搜索词。
以下是我的需求:
应用程序从视图A开始。
视图A启动视图B,视图B又启动视图C。
是否有一种方法可以使视图C直接返回到A,而不会解除自身并暴露B。例如,一个主菜单按钮。
对某些人来说,这可能听起来像一个愚蠢的问题。我在搜索时找到的相关信息比较少,主要是因为我无法找到适当的搜索词。
以下是我的需求:
应用程序从视图A开始。
视图A启动视图B,视图B又启动视图C。
是否有一种方法可以使视图C直接返回到A,而不会解除自身并暴露B。例如,一个主菜单按钮。
如果你有一个UINavigationController,可以调用popToRootViewControllerAnimated:
。如果将动画参数指定为NO
,则将直接跳回根视图而不显示B。
我已经找到了解决问题的方法。虽然有点不太规范(可能会被批评),但在测试中表现良好,实现起来也非常快速。以下是我的做法。
在我的应用程序中,我有一个名为GlobalVars的单例类(我用它来存储各种全局设置)。这个类包含一个名为home_pressed的布尔值和相关的访问器(通过synthesize实现)。如果您愿意,您也可以将此值存储在应用程序委托中。
在每个带有主菜单按钮的视图控制器中,我将按钮连接到homePressed IBAction方法,如下所示。首先将全局的homePressed布尔值设置为YES,然后以通常的方式关闭视图控制器,但不使用动画效果。
-(IBAction) homePressed: (id) sender
{
[GlobalVars _instance].homePressed = YES;
[self dismissModalViewControllerAnimated: NO];
}//end homePressed
-(void) viewDidAppear: (Bool) animated
{
if ([GlobalVars _instance].homePressed == YES)
{
[self dismissModalViewController: NO];
}
else
{
//put normal view did appear code here/
}
}//end viewDidAppead
-(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?