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



我知道这可能看起来像重复,但这并不是因为我找到的所有问题/帖子都与我的无关,或者不起作用。

这是我所拥有的。我的根视图控制器是一个 HoldingViewController,它有一个左、主和右视图控制器。在我的主视图控制器中,在视图中确实加载了,我有一个教程视图控制器,如果用户还没有看到教程,则会启动该控制器。关闭视图控制器时遇到的问题是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!

有没有人知道如何解决问题,或者我的问题是什么以及我做错了什么?任何帮助,不胜感激。提前感谢!

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

GRxTutorialViewController *grxTutorialViewController = [[GRxTutorialViewController alloc]
    initWithNibName:@"GRxTutorialViewController" bundle:[NSBundle mainBundle]];
self.window.rootViewController = grxTutorialViewController;

在您的教程中,不要忽略它。改为呈现 HoldingViewController。

在 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进行一些修改。但是,我认为不适合您的结构。实际上,有很多解决方案退出,但您必须改变结构。如果您不想更改结构,此解决方案应该有效。

相关内容

最新更新