programing

UIViewController의 보기가 표시되는지 확인하는 방법

goodsources 2023. 5. 26. 20:54
반응형

UIViewController의 보기가 표시되는지 확인하는 방법

다양한 보기가 있는 탭 모음 응용 프로그램이 있습니다.어떤 특정한 것이UIViewController현재 내부에서 볼 수 있습니다.UIViewController을 찾는 중)

뷰가 현재 보이는 경우 뷰의 속성은 nil이 아니므로 뷰 컨트롤러에서 기본 뷰를 확인합니다.

메소드를 호출하면 뷰가 로드되지 않는 경우 뷰가 로드됩니다(로드되지 않은 경우). 이는 불필요하며 바람직하지 않을 수 있습니다.그것이 이미 적재되었는지 먼저 확인하는 것이 좋을 것입니다.이 문제를 방지하기 위해 isViewLoaded에 통화를 추가했습니다.

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

iOS9 이후로 더 쉬워졌습니다.

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

또는 보기 컨트롤러를 관리하는 UINavigationController가 있는 경우 표시되는 ViewController 속성을 대신 확인할 수 있습니다.

@을 @programmr @programmr로 UIViewController범주:

// 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됩니다.

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
}

@programmr의 답변을 토대로 빠른 연장을 하였습니다.

그것은 당신이 쉽게 확인할 수 있게 해줍니다.UIViewController화면에 다음과 같이 표시됩니다.

if someViewController.isOnScreen {
    // Do stuff here
}

확장자:

//
//  UIViewControllerExtension.swift
//

import UIKit

extension UIViewController{
    var isOnScreen: Bool{
        return self.isViewLoaded() && view.window != nil
    }
}

컨테이너 뷰 컨트롤러의 맥락에서, 저는 다음과 같은 것을 발견했습니다.

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

잘 작동합니다.

저는 스위프트 5에서 이 작은 확장을 사용하는데, 이것은 UIView의 구성원인 모든 객체를 간단하고 쉽게 확인할 수 있게 해줍니다.

extension UIView {
    var isVisible: Bool {
        guard let _ = self.window else {
            return false
        }
        return true
    }
}

그럼 단순한 if 명세서 확인으로 사용합니다...

if myView.isVisible {
    // do something
}

도움이 되길 바랍니다! :)

보기가 이미 창 계층 스택에 있는 경우 표시되는 좋은 점입니다.따라서 이 기능에 대한 클래스를 확장할 수 있습니다.

extension UIViewController {
  var isViewAppeared: Bool { viewIfLoaded?.isAppeared == true }
}

extension UIView {
  var isAppeared: Bool { window != nil }
}

XCode 6.4(iOS 8.4용), ARC 사용

분명히 그것을 하는 많은 방법들.제게 도움이 된 것은 다음과 같습니다.

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

이 기능은 다음과 같은 방식으로 모든 뷰 컨트롤러에서 사용할 수 있습니다.

[self.view.window isKeyWindow]

이 숙박업소를 호출하는 경우-(void)viewDidLoad0을 얻으면, 다음에 이것을 부르면 됩니다.-(void)viewDidAppear:(BOOL)animated1점입니다.

이것이 누군가에게 도움이 되기를 바랍니다.감사합니다!건배.

UINavigation Controller를 사용하면서 모달 뷰도 처리하려면 다음과 같이 사용합니다.

#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");
}

나는 그 기능들을 찾았습니다.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의 코멘트에 기초하고 있습니다.

더 복잡한 시나리오가 있는 경우 위의 다른 답변을 참조하십시오.

확인하실 수 있습니다.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

보기(macOS):

extension NSViewController {
    var isOnScreen: Bool {
        return ( self.isViewLoaded && view.window != nil )
    }
}

언급URL : https://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible

반응형