[ios] UIViewController의보기가 보이는지 확인하는 방법

많은보기가있는 탭 표시 줄 응용 프로그램이 있습니다. UIViewController내부에서 특정 항목 이 현재 보이는지 알 수있는 방법 이 UIViewController있습니까? (재산을 찾고)



답변

뷰가 현재 표시되어있는 경우 뷰의 창 속성 은 0이 아닙니다. 뷰 컨트롤러에서 기본 뷰를 확인하십시오.

view 메소드를 호출하면 뷰가로드되고 (로드되지 않은 경우) 불필요 할 수 있습니다. 이미로드되어 있는지 먼저 확인하는 것이 좋습니다. 이 문제를 피하기 위해 isViewLoaded에 대한 호출을 추가했습니다.

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

iOS9부터는 더 쉬워졌습니다.

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

또는 뷰 컨트롤러를 관리하는 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


답변

위의 솔루션에는 몇 가지 문제가 있습니다. 예를 들어를 사용하는 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
}

스위프트 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
        }
    }
}


답변

UITabBarControllerselectedViewController속성 을 사용하려고 합니다. 탭 막대 컨트롤러에 연결된 모든 뷰 컨트롤러에는 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
    }
}