iOS 8中viewDidLoad模态呈现会导致多次呈现

3
所以我有一个屏幕,会检查某些属性,并在定义的情况下立即在viewDidLoad中模态地加载另一个视图,没有动画,在当前加载的视图上(不显示底下的视图)。在iOS 8之前,当这样做时,原始视图会暂停其加载(不会进行viewWillAppearviewDidLayoutSubviews等),直到覆盖控制器被解除。我发现这种行为适合我的需求,因为可以对原始视图中的元素进行任何动画。然而,在iOS 8中,我得到了完全不同的事件链。首先,在某些情况下,viewDidLayoutSubviews会被调用两次(这是怎么回事?)但更重要的是,视图在viewDidAppear之前不喜欢弹出另一个控制器,抱怨未平衡的调用开始/结束出现转换。不仅如此,但底层的viewController继续它的加载(viewWillAppearviewDidLayoutSubviews等),尽管它没有显示,导致这些事件中的所有方法都触发。如果苹果已经更新了实现这样的内容的方式,我会感激,因此,如果新的元数据是完全不同的过程,我愿意采用,但是,现在我无法使这个工作适当。

我希望您能帮助我如何让此模态视图插入而不会导致底层视图继续加载。

谢谢,
Mike

更新:将会带来一些代码。以下是主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中调用演示文稿会导致呈现视图控制器的继续。 在iOS 8之前,如果尚未呈现显示VC,则会暂停,直到模态VC已被解除,然后它将像往常一样完成。但是,在iOS 8中情况并非如此,正如我的原始帖子所述。


@Sjors 添加了一些代码,但我担心我的解释让它变得更加复杂了! - Mackey18
你试过把这个代码块从viewDidLoad移到viewWillAppear吗? - sha
awakeFromNib怎么样? - sha
@sha 在此时,呈现视图控制器不会在窗口层次结构中,因此无法显示该控制器。 - Mackey18
你的检查位置不正确。在第一次显示此视图控制器之前,应该先执行 if (hasNotSeenTutorial) - Aaron Brager
显示剩余2条评论
1个回答

1

苹果公司在iOS 8中加强了其规则。举个例子来说明:在我的应用程序中,我过去会从导航堆栈中弹出一些视图控制器,然后立即推入一个新的视图控制器,但是在iOS7中从未看到过这种弹出,只有推送转换发生(逻辑上应该先看到弹出,然后再推送)。而在iOS 8中,这种情况发生了改变。现在只有在看到和注意到弹出之后才会看到推送,这会严重破坏用户体验。

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

就你的情况而言,根据我的经验,我可以告诉你,你一直以来都在错误地进行操作。随着苹果公司的严格要求,你的实现似乎已经被打破了。 在我看来,唯一的解决方案是将每个检查移动到viewdidAppear中。

如果您希望继续以前在iOS7中的方式进行操作,则可以使用以下检查:

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

尽管我建议您避免这样做,因为您的目标完全可以实现。而且,您所做的事情很容易导致导航栈不一致,从而使应用程序崩溃。

不确定为什么这个被投票否决了。如果苹果已经改变了其内部规则,我们需要知道。我现在正在处理一个问题(https://dev59.com/2F8e5IYBdhLWcg3wNIFp),我想知道是否可能会陷入类似的困境。 - Gallymon
哇!被投票否决了!至少我的尝试应该得到一个回复来解释为什么被否决。这样做非常不负责任。 - Abhishek Arora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接