我知道这可能看起来像重复,但这并不是因为我找到的所有问题/帖子都与我的无关,或者不起作用。
这是我所拥有的。我的根视图控制器是一个 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进行一些修改。但是,我认为不适合您的结构。实际上,有很多解决方案退出,但您必须改变结构。如果您不想更改结构,此解决方案应该有效。