[iphone] ViewController가 모달로 표시되는지 여부를 확인할 수 있습니까?

ViewController 클래스 내부에서 모달 뷰 컨트롤러로 표시되는지 확인할 수 있습니까?



답변

modalViewControlleriOS 6에서 더 이상 사용되지 않기 때문에 다음 은 iOS 5 이상에서 작동하고 경고없이 컴파일되는 버전입니다.

목표 -C :

- (BOOL)isModal {
    return self.presentingViewController.presentedViewController == self
      || (self.navigationController != nil && self.navigationController.presentingViewController.presentedViewController == self.navigationController)
      || [self.tabBarController.presentingViewController isKindOfClass:[UITabBarController class]];
}

빠른:

var isModal: Bool {
    return self.presentingViewController?.presentedViewController == self
        || (self.navigationController != nil && self.navigationController?.presentingViewController?.presentedViewController == self.navigationController)
        || self.tabBarController?.presentingViewController is UITabBarController
}

Felipe의 대답에 대한 모자 팁.


답변

iOS 6 이상을 찾고 있다면이 답변은 더 이상 사용되지 않으며 Gabriele Petronella의 답변을 확인해야합니다.


UIKit에 고유 한 속성 또는 메서드로서이를 수행하는 깔끔한 방법은 없습니다. 할 수있는 일은 컨트롤러의 여러 측면을 확인하여 모달로 표시되는지 확인하는 것입니다.

따라서 현재 ( self코드에서와 같이 표시됨) 컨트롤러가 모달 방식으로 표시 UIViewController되는지 확인하기 위해 카테고리 에 다음 기능이 있습니다. 또는 프로젝트에서 다른 UIKit 컨트롤러를 사용할 필요가없는 경우 UITableViewController예) 다른 컨트롤러가 상속하는 기본 컨트롤러에서

-(BOOL)isModal {

     BOOL isModal = ((self.parentViewController && self.parentViewController.modalViewController == self) ||
            //or if I have a navigation controller, check if its parent modal view controller is self navigation controller
            ( self.navigationController && self.navigationController.parentViewController && self.navigationController.parentViewController.modalViewController == self.navigationController) ||
            //or if the parent of my UITabBarController is also a UITabBarController class, then there is no way to do that, except by using a modal presentation
            [[[self tabBarController] parentViewController] isKindOfClass:[UITabBarController class]]);

    //iOS 5+
    if (!isModal && [self respondsToSelector:@selector(presentingViewController)]) {

        isModal = ((self.presentingViewController && self.presentingViewController.modalViewController == self) ||
             //or if I have a navigation controller, check if its parent modal view controller is self navigation controller
             (self.navigationController && self.navigationController.presentingViewController && self.navigationController.presentingViewController.modalViewController == self.navigationController) ||
             //or if the parent of my UITabBarController is also a UITabBarController class, then there is no way to do that, except by using a modal presentation
             [[[self tabBarController] presentingViewController] isKindOfClass:[UITabBarController class]]);

    }

    return isModal;

}

편집 : UITabBarController가 사용되고 있는지 확인하기 위해 마지막 검사를 추가했으며 다른 UITabBarController를 모달로 제시했습니다.

편집 2 : 더 이상 UIViewController대답하지 않고 대신 iOS 5 이상 확인을 추가 했습니다.parentViewControllerpresentingViewController

편집 3 : https://gist.github.com/3174081의 경우를 대비하여 요점을 만들었습니다.


답변

iOS5 +에서 볼 수 있듯이 UIViewController Class Reference “presentingViewController”속성에서 가져올 수 있습니다.

presentingViewController이 뷰 컨트롤러를 제공 한 뷰 컨트롤러입니다. (읽기 전용)

@property (nonatomic, readonly) UIViewController * presentingViewController
토론

이 메시지를 수신 한 뷰 컨트롤러가 다른 뷰 컨트롤러에서 제공되는 경우이 속성은이를 제공하는 뷰 컨트롤러를 보유합니다. 뷰 컨트롤러가 표시되지 않았지만 상위 항목 중 하나가 표시되는 경우이 속성은 가장 가까운 상위 항목을 표시하는 뷰 컨트롤러를 보유합니다. 뷰 컨트롤러 나 그 조상이 표시되지 않는 경우이 속성은 nil을 유지합니다.

가용성
아이폰 OS 5.0 이상에서 사용할 수 있습니다.
UIViewController.h에서
선언


답변

없는 경우 presentedAsModalUIViewController 하위 클래스 에서이 ( )에 대한 속성을 정의 YES하고 ViewController를 모달보기로 표시 하기 전에로 설정할 수 있습니다.

childVC.presentedAsModal = YES;
[parentVC presentModalViewController:childVC animated:YES];

viewWillAppear재정의 에서이 값을 확인할 수 있습니다.

나는 견해가 어떻게 제시되는지를 명시하는 공식적인 재산이 없다고 생각하지만, 당신이 자신의 견해를 만드는 것을 방해하는 것은 없습니다.


답변

self.navigationController가 모달로 표시되지만 self가 self.navigationController.viewControllers [0]과 같지 않은 경우 Petronella의 대답 은 작동하지 않습니다.이 경우 self가 푸시됩니다.

문제를 해결할 수있는 방법은 다음과 같습니다.

return self.presentingViewController.presentedViewController == self
            || (self.navigationController != nil && self.navigationController.presentingViewController.presentedViewController == self.navigationController && self == self.navigationController.viewControllers[0])
            || [self.tabBarController.presentingViewController isKindOfClass:[UITabBarController class]];

그리고 Swift에서 :

return self.presentingViewController?.presentedViewController == self
        || (self.navigationController != nil && self.navigationController?.presentingViewController?.presentedViewController == self.navigationController && self.navigationController?.viewControllers[0] == self)
        || self.tabBarController?.presentingViewController is UITabBarController


답변

작동합니다.

if(self.parentViewController.modalViewController == self)…


답변

확인하는 가장 좋은 방법

 if (self.navigationController.presentingViewController) {
         NSLog(@"Model Present");
    }