如何判断UIViewController的视图是否可见

636

我有一个带有多个视图的选项卡应用程序。有没有一种方法可以从UIViewController中知道当前是否可见特定的UIViewController?(寻找属性)


18个回答

4

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的结果。
希望这能帮助一些人。谢谢!祝好!

3

我在UIViewController.h中找到了这些函数。

/*
  These four methods can be used in a view controller's appearance callbacks to determine if it is being
  presented, dismissed, or added or removed as a child view controller. For example, a view controller can
  check if it is disappearing because it was dismissed or popped by asking itself in its viewWillDisappear:
  method by checking the expression ([self isBeingDismissed] || [self isMovingFromParentViewController]).
*/

- (BOOL)isBeingPresented NS_AVAILABLE_IOS(5_0);
- (BOOL)isBeingDismissed NS_AVAILABLE_IOS(5_0);

- (BOOL)isMovingToParentViewController NS_AVAILABLE_IOS(5_0);
- (BOOL)isMovingFromParentViewController NS_AVAILABLE_IOS(5_0);

也许以上函数可以检测ViewController是否已出现。

3

如果您正在使用导航控制器并想知道自己是否在“活动”和“顶部”控制器中,那么请使用以下代码:

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

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

如果你有更复杂的情况,请参考上面的其他答案。


如果应用程序进入后台,然后再返回前台,此代码将永远不会被调用。我正在寻找一种解决方案,可以检查视图控制器是否对用户可见。用户可能会将应用程序置于后台几天,当它重新回到前台时,我希望更新UI。请告诉我您是否能够提供帮助。 - bibscy

3

如果您正在使用UINavigationController并且想要处理模态视图,则以下是我使用的方法:

#import <objc/runtime.h>

UIViewController* topMostController = self.navigationController.visibleViewController;
if([[NSString stringWithFormat:@"%s", class_getName([topMostController class])] isEqualToString:@"NAME_OF_CONTROLLER_YOURE_CHECKING_IN"]) {
    //is topmost visible view controller
}

2
当导航控制器可用时,我发现这种方法比被接受的答案更可靠。这可以缩短为:if ([self.navigationController.visibleViewController isKindOfClass:[self class]]) { - Darren

3

我在展示视图控制器时采用的方法是检查所展示控制器的类。如果展示的视图控制器是ViewController2,则执行一些代码。

UIViewController *vc = [self presentedViewController];

if ([vc isKindOfClass:[ViewController2 class]]) {
    NSLog(@"this is VC2");
}

2
您可以通过window属性进行检查。
if(viewController.view.window){

// view visible

}else{

// no visible

}

1

我需要这个来检查视图控制器是否是当前查看的控制器,我通过检查是否有任何已呈现的视图控制器或通过导航器推送来实现此目的,我发布它以防有人需要这样的解决方案:

if presentedViewController != nil || navigationController?.topViewController != self {
      //Viewcontroller isn't viewed
}else{
     // Now your viewcontroller is being viewed 
}

0

窗口:

window.isVisible

viewController.view.window?.isVisible ?? false

查看(macOS):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接