多くのビューを備えたタブバーアプリケーションがあります。UIViewController特定の が 内から現在表示されているかどうかを知る方法はありUIViewControllerますか? (物件を探しています)
17 に答える
ビューが現在表示されている場合、ビューのウィンドウ プロパティは非 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プロパティを確認できます。
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
答えのSwift 2.2バージョンを探している人のために:
if self.isViewLoaded() && (self.view.window != nil) {
// viewController is visible
}
とスウィフト 3 :
if self.isViewLoaded && (self.view.window != nil) {
// viewController is visible
}
オーバーフルスクリーンまたはオーバーコンテキストのモーダル プレゼンテーションの場合、「表示されている」とは、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
}
}
}
UITabBarControllerのプロパティを使用しselectedViewControllerます。タブ バー コントローラーにアタッチされたすべてのビュー コントローラーにはtabBarControllerプロパティ セットがあるため、任意のビュー コントローラーのコード内から次のことができます。
if([[[self tabBarController] selectedViewController] isEqual:self]){
//we're in the active controller
}else{
//we are not
}
@progrmrの回答に基づいて迅速な拡張を行いました。
UIViewController次のように aが画面に表示されているかどうかを簡単に確認できます。
if someViewController.isOnScreen {
// Do stuff here
}
拡張子:
//
// UIViewControllerExtension.swift
//
import UIKit
extension UIViewController{
var isOnScreen: Bool{
return self.isViewLoaded() && view.window != nil
}
}
私の目的のために、コンテナView Controllerのコンテキストで、私はそれを見つけました
- (BOOL)isVisible {
return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}
うまく機能します。
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 が返されます。
これが誰かに役立つことを願っています。ありがとう!乾杯。
これらの関数は で見つかりました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のコメントに基づいています。
より複雑なシナリオがある場合は、上記の他の回答を参照してください。
モーダルで提示されたビュー コントローラーに使用したアプローチは、提示されたコントローラーのクラスをチェックすることでした。提示されたView Controllerがそうである場合、ViewController2私はいくつかのコードを実行します。
UIViewController *vc = [self presentedViewController];
if ([vc isKindOfClass:[ViewController2 class]]) {
NSLog(@"this is VC2");
}