iOS 8 viewDidLoad模式演示会导致多个演示



所以我有一个屏幕,它会检查某些属性,在定义的情况下,会立即在viewDidLoad中以模式加载另一个视图,而不会在当前加载的视图上进行动画加载(以免显示下面的视图)。在iOS 8之前,当完成此操作时,原始视图将暂停加载(不会继续使用viewWillAppearviewDidLayoutSubviews等),直到取消覆盖控制器。我发现这种行为适合我的需求,因为可以对原始视图中的元素进行任何动画处理。然而,在iOS 8中,我得到了一个完全不同的事件链。首先,由于某种原因,viewDidLayoutSubviews被调用了两次(怎么了?)但更重要的是,视图不喜欢在viewDidAppear之前的任何时候弹出另一个控制器,抱怨unbalanced calls to begin/end appearance transitions。不仅如此,底层viewController还会继续加载(viewWillAppearviewDidLayoutSubviews等),尽管它没有显示出来,这会导致这些事件中的所有方法都被激发。我很感激苹果是否更新了实现这一目标的方式,所以如果新的元是一个完全不同的过程,我愿意采用,但事实上,我无法让它正常工作。

如果能在不让底层视图继续加载的情况下插入此模态视图,我将不胜感激。

谢谢,
Mike

UPDATE:将引入一些代码。下面是主viewControllerviewDidLoad,如果需要,它将提供模式VC。

-(void) viewDidLoad{
    if(hasNotSeenTutorial){
        TutVC* vc = [[TutVC alloc] initWithNibName:@"tutNib" bundle:nil]
        vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self.navigationController presentViewController:vc animated:NO completion:^{
             NSLog(@"Has Completed Presentation");
         }];
    }
}

这就是问题所在。在viewDidLoad中调用此处的演示会导致演示VC的演示继续。在iOS 8之前,演示VC(如果尚未演示)将暂停,直到模态VC被驳回,然后照常完成。根据我最初的帖子,iOS 8中的情况并非如此。

苹果对ios 8的规定更加严格。举个例子,我将通过这个来阐述我的观点:-在我的应用程序中,我曾经从导航堆栈中弹出一些视图控制器,然后推送一个新的,但在ios7中从未出现过这种弹出,只出现了推送转换(从逻辑上讲,应该先看到弹出,然后再看到推送)。在ios 8中,情况发生了变化。现在,只有在看到并注意到pop之后才能看到push。这相当严重地破坏了用户体验。

我在其他领域也注意到了这种严格性,但这些都与UI/UX无关,所以我现在不会详细介绍。

就你的情况而言,根据我的经验,我可以告诉你,你一直在以错误的方式做事。随着苹果公司的严格执行,您的执行似乎出现了问题。在我看来,唯一的解决方案是将视图中的每一张支票都转移到Appear。

如果你想继续你之前为ios7做的事情,你可以使用这个检查:

    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
  // Code for ios 8 implementation
}
else
{
  // Code for ios 7 implementation
}

尽管我建议你避免,因为你的目标是完全可以实现的。此外,您所做的操作很容易导致导航堆栈不一致,从而导致应用程序崩溃。

最新更新