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
}
UITabBarController
의 selectedViewController
속성 을 사용하려고 합니다. 탭 막대 컨트롤러에 연결된 모든 뷰 컨트롤러에는 tabBarController
속성이 설정되어 있으므로 모든 뷰 컨트롤러 코드 내에서 할 수 있습니다.
if([[[self tabBarController] selectedViewController] isEqual:self]){
//we're in the active controller
}else{
//we are not
}
전체 화면 또는 상황에 맞는 모달 프레젠테이션의 경우 "표시"는 뷰 컨트롤러 스택의 상단에 있거나 다른 뷰 컨트롤러에 의해 표시되는 것을 의미 할 수 있습니다.
뷰 컨트롤러 "상위 뷰 컨트롤러"가 "표시"와 다른지 확인하려면 뷰 컨트롤러의 내비게이션 컨트롤러의 뷰 컨트롤러 스택을 확인해야합니다.
이 문제를 해결하기 위해 코드를 작성했습니다.
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
}
}
}
@progrmr의 답변을 기반으로 신속한 확장을했습니다.
다음 UIViewController
과 같이 a 가 화면에 있는지 쉽게 확인할 수 있습니다 .
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);
}
잘 작동합니다.
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
}
내가 모달 제시 뷰 컨트롤러에 사용한 접근법은 제시된 컨트롤러의 클래스를 확인하는 것이 었습니다. 제시된보기 컨트롤러 인 경우 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
이 나타나는지 여부를 감지 할 수 있습니다 .
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 의 의견을 기반으로 합니다.
더 복잡한 시나리오가있는 경우 위의 다른 답변을 참조하십시오.
당신은 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
}
이 작은 확장 기능을 Swift 5 에서 사용하면 UIView의 멤버 인 객체를 간단하고 쉽게 확인할 수 있습니다.
extension UIView {
var isVisible: Bool {
guard let _ = self.window else {
return false
}
return true
}
}
그런 다음 간단한 if 문 확인으로 사용합니다 ...
if myView.isVisible {
// do something
}
도움이 되길 바랍니다! :)
참고 URL : https://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible
'development' 카테고리의 다른 글
다형성이란 무엇이며, 그 목적은 무엇이며 어떻게 사용됩니까? (0) | 2020.02.10 |
---|---|
목록을 변환하는 방법 (0) | 2020.02.10 |
채워지지 않은 JavaScript 배열을 만드는 가장 효율적인 방법은 무엇입니까? (0) | 2020.02.10 |
렌더링 후 입력에 초점 설정 (0) | 2020.02.10 |
Naive Bayes 분류에 대한 간단한 설명 (0) | 2020.02.10 |