popToRootViewControllerAnimated不显示根视图控制器

时间:2012-01-18 19:48:37

标签: objective-c ios4 uinavigationcontroller

我需要一些导航控制器问题的帮助。

我有一个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消息。没有不同。仍然会弹出一堆控制器,但屏幕会继续显示我的模态视图控制器的视图并继续执行。

有人能帮帮我吗?

1 个答案:

答案 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
}