iOS 8 viewDidLoad 模态演示导致多个演示

Posted

技术标签:

【中文标题】iOS 8 viewDidLoad 模态演示导致多个演示【英文标题】:iOS 8 viewDidLoad modal presentation causes multiple presentations 【发布时间】:2014-09-20 12:21:55 【问题描述】:

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

对于如何让这个模态视图插入而不导致底层视图继续加载的任何帮助,我将不胜感激。

谢谢, 迈克

更新:将引入一些代码。下面是主要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 中并非如此。

【问题讨论】:

你能加一点代码让这个故事更容易理解吗? @Sjors 添加了一些代码,但我担心我的解释让它变得更加复杂! 你试过把这个块从viewDidLoad移动到viewWillAppear吗? @sha 这样做不会得到想要的结果。这个想法是在呈现屏幕之前插入一个视图。 awakeFromNib 呢? 【参考方案1】:

Apple 已对 ios 8 制定了更严格的规则。举个例子,我将通过这个来说明我的观点:- 在我的应用程序中,我曾经从导航堆栈中弹出一些视图控制器,然后,推送 a新的,但在 ios7 中从未见过 pop,似乎只发生了 push 转换(从逻辑上讲,应该先看到 pop,然后再看到 push)。而在 ios 8 中,这件事发生了变化。现在只有在看到并注意到弹出之后才能看到推送。这严重破坏了用户体验。

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

就您的情况而言,根据我的经验,我可以告诉您,您一直在以错误的方式做事。随着苹果变得严格,您的实施似乎中断了。 我认为唯一的解决方案是在 viewdidAppear 中转移每个检查。

如果您希望继续之前为 ios7 所做的方式,您可以使用此检查:

    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

  // Code for ios 8 implementation

else

  // Code for ios 7 implementation

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

【讨论】:

不知道为什么这被否决了。如果苹果改变了其内部规则,我们需要了解它。我现在正在处理一个问题 (***.com/questions/25987244/…),我想知道我是否会陷入类似的网络中。 哇!投了反对票!至少我的尝试应该得到投票否决的答复。非常不负责任。

以上是关于iOS 8 viewDidLoad 模态演示导致多个演示的主要内容,如果未能解决你的问题,请参考以下文章

iOS 13 UIViewController 模态演示阴影

Xcode 8 Swift 3:未调用模态演示转换委托

iOS 8 unwind segue 导致方向错误

iOS解决使用模态视图 导致无法pushViewController

iOS解决使用模态视图 导致无法pushViewController

为啥模态演示表单未按预期显示?