【问题标题】:How to check if a view is inViewHierarchy or not?如何检查视图是否在视图层次结构中?
【发布时间】:2012-11-22 19:38:46
【问题描述】:

例如,如果 viewController 的视图在 viewHierarchy 中,而我刚刚完成下载内容,我想快速更新内容。如果 self.view 不在 viewHierarchy 中,我想推迟更新。

我想,我可以添加一个布尔变量来表明这一点,并将其放在 viewWillAppear 和 viewWillDisappear 上。

我还可以扫描窗口,看看 UIView 是否在 viewHierarchy 中。

有没有更直接的方法?

【问题讨论】:

    标签: objective-c xcode4.5


    【解决方案1】:

    从 iOS 9.0 开始,在 Swift 中,您可以在视图控制器中执行此操作:

    if viewIfLoaded?.window != nil {
        // view should be updated
    }
    

    或者如果你想实际使用视图,可以这样做:

    if let view = viewIfLoaded, view.window != nil {
        // update view
    }
    

    对于旧版本的 iOS,在 Objective-C 中:

    if (self.isViewLoaded && self.view.window != nil) {
        // view is in a view hierarchy and should be updated
    }
    

    【讨论】:

    • 是否需要检查 isViewLoaded?鉴于如果未加载视图, self.view.window 无论如何都必须为零。第一次访问 self.view 时也会加载视图吗?
    • 是的,当您调用self.view 时,视图将被加载,如果它尚未加载的话。如果视图尚未加载,那么它肯定不在屏幕上。如果它不在屏幕上,您想推迟更新。如果您要推迟更新,为什么要加载视图?
    • 我们可以在iOS 9之后使用self.viewIfLoaded.window stackoverflow.com/a/2777460
    【解决方案2】:

    viewDidLoad 仅在视图加载完成后才会触发,我认为。因此,我认为您可以在 viewDidLoad 本身中添加必要的功能。

    【讨论】:

      【解决方案3】:

      要检查它是否不在视图层次结构中,这就足够了:

      // From a UIViewController sub-class
      if !self.isViewLoaded {
          // view is not in the view hierarchy
      }
      

      【讨论】:

      • 这不正确。可能视图已加载,但尚未添加到视图层次结构中(例如,在您访问 UIViewController 的初始化程序中的 self.view 之后)。
      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多