警告:尝试在进行中时在视图控制器上显示模态控制器

时间:2013-11-05 19:03:29

标签: ios objective-c cocoa-touch debugging uiviewcontroller

我知道这可能看起来像是重复但不是因为我发现的所有问题/帖子都与我的有关,或者没有工作。

这就是我所拥有的。我的根视图控制器是一个HoldViewController,它有一个左,右和右视图控制器。在我的主视图控制器中,在视图中加载,我有一个教程视图控制器,如果用户尚未看到该教程,则会启动它。我解雇视图控制器时遇到的问题是Warning: Attempt to present <TutorialViewController: 0xade1780> on <HoldingViewController: 0xaaaa500> while a presentation is in progress!

主视图控制器视图中的调用确实加载了:

if(![[NSUserDefaults standardUserDefaults] valueForKey:@"hasSeenTutorial"])
{
    [[NSUserDefaults standardUserDefaults] synchronize];
    GRxTutorialViewController *grxTutorialViewController = [[GRxTutorialViewController alloc]
    initWithNibName:@"GRxTutorialViewController" bundle:[NSBundle mainBundle]];
    grxTutorialViewController.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:grxTutorialViewController animated:NO completion:nil];
}

在教程视图中,我创建了一个关闭此模态视图控制器的按钮。它是:

-(void)skipIntro
{
    NSLog(@"Skip pressed");
    [self dismissViewControllerAnimated:YES completion:nil];
}

我也试过放入HidingViewController的viewDidLoad,它甚至没有显示它并且记录了这条消息:

Warning: Attempt to present <TutorialViewController: 0xaac0ed0> on <HidingViewController: 0xaabe8d0> whose view is not in the window hierarchy!

有没有人有任何想法如何解决问题或我的问题是什么以及我做错了什么?任何帮助表示赞赏。提前谢谢!

2 个答案:

答案 0 :(得分:0)

检查AppDelegate中的[[NSUserDefaults standardUserDefaults] valueForKey:@"hasSeenTutorial"]并更改根视图控制器,如下所示:

GRxTutorialViewController *grxTutorialViewController = [[GRxTutorialViewController alloc]
    initWithNibName:@"GRxTutorialViewController" bundle:[NSBundle mainBundle]];

self.window.rootViewController = grxTutorialViewController;

在您的教程中不要忽略它。现在改为HoldViewController。

答案 1 :(得分:-1)

在HidingViewController的viewDidAppear方法中启动教程视图控制器可能对您有所帮助

修改详细信息

只需保留一个布尔值,就可以避免循环。如果您只想显示一次教程,

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tutorialShouldDisplay = YES;
}



 - (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (self.tutorialShouldDisplay && ![[NSUserDefaults standardUserDefaults] valueForKey:@"hasSeenTutorial"])
    {
        self.tutorialShouldDisplay = NO;
        /*
             should set NSUserDefaults properly for key @"hasSeenTutorial"
        */
        GRxTutorialViewController *grxTutorialViewController = [[GRxTutorialViewController alloc] initWithNibName:@"GRxTutorialViewController" bundle:[NSBundle mainBundle]];
        grxTutorialViewController.modalPresentationStyle = UIModalPresentationFullScreen;
        [self presentViewController:grxTutorialViewController animated:NO completion:nil];
    }
}

正如@hasan所说,你可以在AppDelegate中对rootViewController进行一些修改。但是,我认为不适合您的结构。 实际上,有许多解决方案退出,但你必须改变结构。如果您不想更改结构,此解决方案应该可行。