我需要一些导航控制器问题的帮助。
我有一个navigationController
推送了4 ViewControllers
。我推送的最后一个vc以模态方式呈现ViewController
。模态ViewController
呈现ActionSheet
。根据用户的回答,我要么仅关闭模态ViewController
,要么我想回到根ViewController
。
在我提供的ViewController
模态中:
- (void) dismissGameReport
{
[[self delegate] GameReportModalWillBeDismissed:modalToPopToRoot];
}
在推送到ViewController
堆栈的最后navigationController
中,我有:
- (void)GameReportModalWillBeDismissed: (BOOL)popToRoot;
{
if (popToRoot)
{
[self.navigationController popToRootViewControllerAnimated:NO];
}
else
{
[self dismissModalViewControllerAnimated:YES];
}
}
解雇模态视图控制器工作正常。 但是,
[self.navigationController popToRootViewControllerAnimated:NO];
不会导致根ViewController
显示其视图。添加一些日志信息我看到在发送到self.navigationController
的消息后,堆栈被正确弹出但执行依次继续。屏幕仍然显示模态ViewController的视图。
作为一种解决方法,我尝试总是解雇模态视图控制器,并在ViewWillAppear
方法中有popToRootAnimated
消息。没有不同。仍然会弹出一堆控制器,但屏幕会继续显示我的模态视图控制器的视图并继续执行。
有人能帮帮我吗?
答案 0 :(得分:6)
我喜欢这些欺骗性的问题。看起来很简单,直到你尝试去做。
我发现基本上你确实需要解雇那个模态视图控制器,但是如果你试图从下一行的导航控制器弹出,那么事情会变得混乱。在尝试弹出之前,您必须确保完成解散。在iOS 5中,您可以像这样使用dismissViewControllerAnimated:completion:
。
-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{
if (popToRoot){
[self dismissViewControllerAnimated:YES completion:^{
[self.navigationController popToRootViewControllerAnimated:YES];
}];
}
else{
[self dismissModalViewControllerAnimated:YES];
}
}
但我发现你的问题标签中有4.0。我为<iOS 5
找到的解决方案远不那么漂亮,但应该仍然可以工作,听起来你已经走在了路上。您希望viewDidAppear:
不是viewWillAppear:
。我的解决方案涉及一个ivar,让我们说:
BOOL shouldPopToRootOnAppear;
然后你的GameReportModalWillBeDismissed:
看起来像这样:
-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{
shouldPopToRootOnAppear = popToRoot;
[self dismissModalViewControllerAnimated:YES];
}
你的viewDidAppear:
看起来像这样......
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
if (shouldPopToRootOnAppear){
[self.navigationController popToRootViewControllerAnimated:YES];
return;
}
// Normal viewDidAppear: stuff here
}