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
}
}
}
은 사니다합용을을 .UITabBarController
의selectedViewController
된 뷰 에는 " " " "라는 이름의 뷰 가 있습니다.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)viewDidLoad
0을 얻으면, 다음에 이것을 부르면 됩니다.-(void)viewDidAppear:(BOOL)animated
1점입니다.
이것이 누군가에게 도움이 되기를 바랍니다.감사합니다!건배.
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
'programing' 카테고리의 다른 글
postgresql 세션/연결 종료 (0) | 2023.05.26 |
---|---|
Node.js? any CURL 내부에서 원격 REST 호출을 하는 방법은 무엇입니까? (0) | 2023.05.26 |
Postgre 복사 중SQL 데이터베이스를 다른 서버로 (0) | 2023.05.26 |
없음을 암시하는 파이썬 3타입? (0) | 2023.05.26 |
부트스트랩 서버에 등록할 수 없습니다. (0) | 2023.05.26 |