ios - viewWillAppear 没有被调用

标签 ios objective-c

我有一个嵌入在导航 Controller (NAV1) 中的 View Controller (VC1)。在它的 viewWillAppear 方法中,我调用以模态方式呈现另一个 View Controller 。在一种情况下,我需要新的 View Controller (VC2) 呈现动画,而在另一种情况下,它应该在没有动画的情况下呈现。 VC2也嵌入了自己的导航 Controller (NAV2)。

当动画标志设置为 TRUE 时一切正常。当我将标志设置为 FALSE 时,出现了一些错误: 1. 我在控制台中收到以下警告:Presenting view controllers on detached view controllers is discouraged 2. 当我在调用 dismissViewControllerAnimated:FALSE completion:nil 后从 VC2 返回时,不会调用 VC1 的 viewWillAppear 方法。如果动画标志设置为 TRUE,则会调用它。

在 VC1 中:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self performSelector:@selector(importStuff:)
                           withObject:nil];

}

-(void)importStuff
{
//instatntiate VC2
//instantiate NAV2

[Utility presentViewController:pNavController
            fromViewController:self
                      animated:FALSE
                    completion:nil];

// the above method calls the presentViewController:animated:completion: method
} 

在 VC2 中:

[Utility dismissViewController:self
                      animated:FALSE
                    completion:nil];

上述方法调用了dismissViewControllerAnimated:方法。

最佳答案

不是解决方案,而是解决方法:

您可以使用 afterDelay:0 轻松地将任何 UI 操作推迟到下一个事件循环:

[self performSelector:@selector(importStuff:)
           withObject:nil
           afterDelay:0];

这将使当前操作有机会完成。
此外,0.4 的延迟将与操作系统匹配。但是,无论您使用什么延迟(除了 0) 都是一个小问题,不能保证在任何情况、设备和内存负载等情况下都能正常工作。

相反,您应该重新审视您的方法。


改变你的设计:

首先不要冒险遇到这个动画比赛。 您有多种选择,包括:

  • 自己控制过渡动画并等待其完成,然后再推送另一个 View Controller (使用完成信号或完成 block )
  • 完全改变你的方法来完全避免这个难题

关于ios - viewWillAppear 没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34350565/

相关文章:

objective-c - 设置 "setDoubleAction"到 "Interface Builder"的选择器?

ios - 无法在 iOS 中配置 facebook LoginButtonDelegate

ios - 如何删除 firebase 中的子项但不删除其所在的文件夹?

ios - GCD 等待 NSURLSessionDataTask 完成

objective-c - 为什么委托(delegate)中需要一些方法?

ios - 生成其他节点后旋转停止

ios - 无法分配给属性 : 'CALayer' is immutable

ios - Swift 复制方法(Code Pattern)

c++ - dynamic_cast 问题 xcode

ios - 添加约束使应用程序崩溃