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


当前回答

下面是@ program作为UIViewController类别的解决方案:

// UIViewController+Additions.h

@interface UIViewController (Additions)

- (BOOL)isVisible;

@end


// UIViewController+Additions.m

#import "UIViewController+Additions.h"

@implementation UIViewController (Additions)

- (BOOL)isVisible {
    return [self isViewLoaded] && self.view.window;
}

@end

其他回答

如果当前视图是可见的,视图的window属性是非空的,所以检查视图控制器中的主视图:

调用view方法会导致视图被加载(如果它没有被加载),这是不必要的,也可能是不希望看到的。最好先检查一下它是否已经加载了。我添加了对isViewLoaded的调用来避免这个问题。

if (viewController.isViewLoaded && viewController.view.window) {
    // viewController is visible
}

自从iOS9以来,这变得更容易了:

if viewController.viewIfLoaded?.window != nil {
    // viewController is visible
}

或者如果你有一个UINavigationController管理视图控制器,你可以检查它的visibleViewController属性。

如果你正在使用一个导航控制器,只是想知道你是否在活动和最顶层的控制器,那么使用:

if navigationController?.topViewController == self {
    // Do something
}

这个答案是基于@mattdipasquale的评论。

如果您有一个更复杂的场景,请参阅上面的其他答案。

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

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

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

if myView.isVisible {
    // do something
}

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

你可以通过window属性来检查

if(viewController.view.window){

// view visible

}else{

// no visible

}

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。

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