回答:
ビューが現在表示されている場合、ビューのウィンドウプロパティは非nilなので、ビューコントローラーでメインビューを確認します。
viewメソッドを呼び出すと、ビューがロードされます(ロードされていない場合)。これは不要であり、望ましくない場合があります。それがすでにロードされているかどうかを最初に確認することをお勧めします。この問題を回避するために、isViewLoadedへの呼び出しを追加しました。
if (viewController.isViewLoaded && viewController.view.window) {
// viewController is visible
}
iOS9以降、簡単になりました:
if viewController.viewIfLoaded?.window != nil {
// viewController is visible
}
または、ビューコントローラーを管理するUINavigationControllerがある場合は、代わりにvisibleViewControllerプロパティを確認できます。
topViewController
。
これは、UIViewController
カテゴリとしての@progrmrのソリューションです。
// 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
上記のソリューションにはいくつかの問題があります。たとえばを使用している場合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 2.2バージョンを探している人のために:
if self.isViewLoaded() && (self.view.window != nil) {
// viewController is visible
}
およびSwift 3:
if self.isViewLoaded && (self.view.window != nil) {
// viewController is visible
}
全画面表示以上またはコンテキスト表示以上のモーダルプレゼンテーションの場合、「可視」とは、ビューコントローラースタックの上にあるか、表示されているだけで別のビューコントローラーで覆われていることを意味します。
「トップビューコントローラーである」というビューコントローラーが「表示されている」とまったく異なるかどうかを確認するには、ビューコントローラーのナビゲーションコントローラーのビューコントローラースタックを確認する必要があります。
この問題を解決するためのコードを書きました。
extension UIViewController {
public var isVisible: Bool {
if isViewLoaded {
return view.window != nil
}
return false
}
public var isTopViewController: Bool {
if self.navigationController != nil {
return self.navigationController?.visibleViewController === self
} else if self.tabBarController != nil {
return self.tabBarController?.selectedViewController == self && self.presentedViewController == nil
} else {
return self.presentedViewController == nil && self.isVisible
}
}
}
isViewLoaded
はSwift 3.0以降のプロパティです。
UITabBarController
のselectedViewController
プロパティを使用します。タブバーコントローラーに接続されているすべてのビューコントローラーにはtabBarController
プロパティセットがあるため、任意のビューコントローラーのコード内から行うことができます。
if([[[self tabBarController] selectedViewController] isEqual:self]){
//we're in the active controller
}else{
//we are not
}
((UINavigationController *)self.tabBarController.selectedViewController).visibleViewController
@progrmrの答えに基づいて迅速な拡張を行いました。
次のUIViewController
ように画面に表示されているかどうかを簡単に確認できます。
if someViewController.isOnScreen {
// Do stuff here
}
拡張子:
//
// UIViewControllerExtension.swift
//
import UIKit
extension UIViewController{
var isOnScreen: Bool{
return self.isViewLoaded() && view.window != nil
}
}
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
}
私はそれらの機能をで見つけました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
出現したかどうかを検出できます。
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を取得した後にこれを呼び出すと
これが誰かを助けることを願っています。ありがとう!乾杯。
ナビゲーションコントローラを使用していて、アクティブで最上位のコントローラにいるかどうかを知りたい場合は、次のコマンドを使用します。
if navigationController?.topViewController == self {
// Do something
}
この回答は@mattdipasqualeに基づいていますのコメントにます。
より複雑なシナリオがある場合は、上記の他の回答を参照してください。
これは、ビューコントローラーが現在表示されているコントローラーかどうかを確認するために必要でした。表示されたビューコントローラーがあるかどうかを確認するか、ナビゲーターを介してプッシュしました。誰かがそのような解決策を必要とする場合に備えて投稿します。
if presentedViewController != nil || navigationController?.topViewController != self {
//Viewcontroller isn't viewed
}else{
// Now your viewcontroller is being viewed
}