【问题标题】:Creation of UIAlertController on ViewWillAppear gives warning在 ViewWillAppear 上创建 UIAlertController 会发出警告
【发布时间】:2015-05-20 13:45:47
【问题描述】:

我试图在ViewWillAppear 上创建一个UIAlertController,它给了我以下警告。

"Warning: Attempt to present <UIAlertController: 0x7f8798c15df0> on <ViewController: 0x7f8798f81450> whose view is not in the window hierarchy!".

我的理解它已经准备好在ViewWillAppear 中向用户显示视图,但相当昂贵。

但是,当我将相同的 UIAlertController 代码移动到 ViewDidAppear 时,它显示了警报消息。 您能否澄清一下ViewWillAppear 中没有显示警报消息。

【问题讨论】:

  • 放到–viewDidAppear:方法中,说法正确,–viewWillAppear:方法调用时你的视图不在视图层次结构中。
  • viewdidappear 出现同样的错误

标签: ios cocoa-touch objective-c-blocks


【解决方案1】:

UIAlertController 不同于典型的UIAlertView,它继承自 UIView。在viewDidLoad 中添加UIView,出现等没有问题,因为您正在将它添加到视图控制器的视图层次结构中。

现在,UIAlertController 是一流的视图控制器。这意味着您应该以与其他视图控制器相同的方式呈现它 - 所有相同的规则都适用。

viewWillAppear 中,视图控制器尚未添加到窗口的层次结构中,因此呈现警报控制器是一个糟糕的选择。如您所见,viewDidAppear 是这里的最佳选择。

【讨论】:

    【解决方案2】:

    viewWillAppear: 不是呈现另一个视图控制器的好位置,因为当前呈现的视图控制器还没有在窗口层次结构中,并且还在过渡动画中。您应该使用viewDidAppear: 或在显示警报控制器之前添加一点延迟。

    【讨论】:

      【解决方案3】:

      这里的大多数答案都很好地涵盖了这个主题,我只是想添加更多细节。在viewWillAppear: 甚至viewDidLoad: 中添加子视图控制器通常没有问题。事实上,如果您在 IB 中使用容器视图控制器,那么它将在调用其中任何一个之前集成。

      这个问题更多地与警报控制器有关。警报控制器在不同于典型 UI(想想 Z 轴)的窗口层次结构上运行,并且以比标准容器更密集的方式操作 UI(因为它不是容器)。

      为了使警报正确显示,它必须在显示当前视图之后发生(这里可能有多种原因)。这就是为什么在 viewDidAppear: 中展示它的原因(因为当前 vc 的视图将完全实时)。

      【讨论】:

        【解决方案4】:

        如果UIAlertController的参数为nil,如titlemessage,也会出现同样的错误

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-28
          • 2016-11-10
          • 2021-08-19
          • 1970-01-01
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多