我有一个带有多个视图的选项卡应用程序。有没有一种方法可以从UIViewController
中知道当前是否可见特定的UIViewController
?(寻找属性)
我有一个带有多个视图的选项卡应用程序。有没有一种方法可以从UIViewController
中知道当前是否可见特定的UIViewController
?(寻找属性)
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的结果。我在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
是否已出现。如果您正在使用导航控制器并想知道自己是否在“活动”和“顶部”控制器中,那么请使用以下代码:
if navigationController?.topViewController == self {
// Do something
}
这个答案基于@mattdipasquale的评论。
如果你有更复杂的情况,请参考上面的其他答案。
如果您正在使用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
}
我在展示视图控制器时采用的方法是检查所展示控制器的类。如果展示的视图控制器是ViewController2
,则执行一些代码。
UIViewController *vc = [self presentedViewController];
if ([vc isKindOfClass:[ViewController2 class]]) {
NSLog(@"this is VC2");
}
window
属性进行检查。if(viewController.view.window){
// view visible
}else{
// no visible
}
我需要这个来检查视图控制器是否是当前查看的控制器,我通过检查是否有任何已呈现的视图控制器或通过导航器推送来实现此目的,我发布它以防有人需要这样的解决方案:
if presentedViewController != nil || navigationController?.topViewController != self {
//Viewcontroller isn't viewed
}else{
// Now your viewcontroller is being viewed
}
window.isVisible
viewController.view.window?.isVisible ?? false
extension NSViewController {
var isOnScreen: Bool {
return ( self.isViewLoaded && view.window != nil )
}
}