612

多くのビューを備えたタブバーアプリケーションがあります。UIViewController特定の が 内から現在表示されているかどうかを知る方法はありUIViewControllerますか? (物件を探しています)

4

17 に答える 17

1170

ビューが現在表示されている場合、ビューのウィンドウ プロパティは非 nil なので、View Controller のメイン ビューを確認します。

ビューメソッドを呼び出すと、ビューがロードされます (ロードされていない場合)。これは不要であり、望ましくない場合があります。すでにロードされているかどうかを最初に確認することをお勧めします。この問題を回避するために、isViewLoaded への呼び出しを追加しました。

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

iOS9以降、より簡単になりました:

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

または、View Controller を管理する UINavigationController がある場合は、代わりにそのvisibleViewControllerプロパティを確認できます。

于 2010-05-05T23:35:31.987 に答える
90

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
于 2011-06-30T03:58:25.183 に答える
45

答えのSwift 2.2バージョンを探している人のために:

if self.isViewLoaded() && (self.view.window != nil) {
     // viewController is visible
}

スウィフト 3 :

if self.isViewLoaded && (self.view.window != nil) {
         // viewController is visible
}
于 2016-04-04T15:03:22.747 に答える
33

オーバーフルスクリーンまたはオーバーコンテキストのモーダル プレゼンテーションの場合、「表示されている」とは、View Controller スタックの上にあること、または単に表示されているが別の View Controller によってカバーされていることを意味します。

ビュー コントローラーが「最上位のビュー コントローラーである」ことが「表示されている」と大きく異なるかどうかを確認するには、ビュー コントローラーのナビゲーション コントローラーのビュー コントローラー スタックを確認する必要があります。

この問題を解決するためのコードを書きました。

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
        }
    }
}
于 2014-12-11T05:13:04.950 に答える
28

UITabBarControllerのプロパティを使用しselectedViewControllerます。タブ バー コントローラーにアタッチされたすべてのビュー コントローラーにはtabBarControllerプロパティ セットがあるため、任意のビュー コントローラーのコード内から次のことができます。

if([[[self tabBarController] selectedViewController] isEqual:self]){
     //we're in the active controller
}else{
     //we are not
}
于 2010-05-05T23:36:19.770 に答える
13

@progrmrの回答に基づいて迅速な拡張を行いました。

UIViewController次のように aが画面に表示されているかどうかを簡単に確認できます。

if someViewController.isOnScreen {
    // Do stuff here
}

拡張子:

//
//  UIViewControllerExtension.swift
//

import UIKit

extension UIViewController{
    var isOnScreen: Bool{
        return self.isViewLoaded() && view.window != nil
    }
}
于 2015-05-20T08:36:22.797 に答える
7

私の目的のために、コンテナView Controllerのコンテキストで、私はそれを見つけました

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

うまく機能します。

于 2014-06-18T15:27:59.270 に答える
4

XCode 6.4、iOS 8.4 用、ARC 対応

明らかにそれを行う多くの方法。私のために働いたものは次のとおりです...

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

これは、次の方法で任意のView Controllerで使用できます。

[self.view.window isKeyWindow]

このプロパティを呼び出すと-(void)viewDidLoad0 が返され、後でこれを呼び出すと-(void)viewDidAppear:(BOOL)animated1 が返されます。

これが誰かに役立つことを願っています。ありがとう!乾杯。

于 2015-07-23T21:08:55.987 に答える
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いるかどうかを検出できます。

于 2015-05-21T07:02:54.890 に答える
3

ナビゲーション コントローラーを使用していて、自分がアクティブ最上位のコントローラーにいるかどうかを知りたい場合は、次を使用します。

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

この回答は、 @mattdipasqualeのコメントに基づいています。

より複雑なシナリオがある場合は、上記の他の回答を参照してください。

于 2016-07-25T17:27:57.933 に答える
3

モーダルで提示されたビュー コントローラーに使用したアプローチは、提示されたコントローラーのクラスをチェックすることでした。提示されたView Controllerがそうである場合、ViewController2私はいくつかのコードを実行します。

UIViewController *vc = [self presentedViewController];

if ([vc isKindOfClass:[ViewController2 class]]) {
    NSLog(@"this is VC2");
}
于 2014-01-26T22:19:41.590 に答える