我有一个标签栏应用程序,有许多视图。有没有办法知道一个特定的UIViewController当前在UIViewController中是可见的?(寻找物业)


当前回答

就我的目的而言,在容器视图控制器的上下文中,我已经找到了

- (BOOL)isVisible {
    return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}

工作得很好。

其他回答

就我的目的而言,在容器视图控制器的上下文中,我已经找到了

- (BOOL)isVisible {
    return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}

工作得很好。

我根据@ program的回答做了一个快速扩展。

它允许你很容易地检查UIViewController是否在屏幕上,就像这样:

if someViewController.isOnScreen {
    // Do stuff here
}

扩展:

//
//  UIViewControllerExtension.swift
//

import UIKit

extension UIViewController{
    var isOnScreen: Bool{
        return self.isViewLoaded() && view.window != nil
    }
}

XCode 6.4, iOS 8.4, ARC启用

显然有很多种方法。对我有效的方法如下:

@property(nonatomic, readonly, getter=isKeyWindow) BOOL keyWindow

这可以在任何视图控制器中以以下方式使用,

[self.view.window isKeyWindow]

如果你在-(void)viewDidLoad中调用这个属性,你得到0,然后如果你在-(void)viewDidAppear:(BOOL)animated后调用这个属性,你得到1。

希望这能帮助到一些人。谢谢!欢呼。

上述解决方案存在几个问题。如果你正在使用,例如,一个UISplitViewController,主视图总是会返回true

if(viewController.isViewLoaded && viewController.view.window) {
    //Always true for master view in split view controller
}

相反,采用这种简单的方法似乎在大多数情况下都很有效,如果不是所有情况:

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

    //We are now invisible
    self.visible = false;
}

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

    //We are now visible
    self.visible = true;
}

我在Swift 5中使用这个小扩展,它使它保持简单和容易检查UIView成员的任何对象。

extension UIView {
    var isVisible: Bool {
        guard let _ = self.window else {
            return false
        }
        return true
    }
}

然后,我只是用它作为一个简单的if语句检查…

if myView.isVisible {
    // do something
}

我希望这能有所帮助!:)