source

루트 뷰 컨트롤러를 입수하는 방법

gigabyte 2023. 4. 9. 21:32
반응형

루트 뷰 컨트롤러를 입수하는 방법

루트 뷰 컨트롤러 인스턴스가 필요합니다.

저는 그 방법을 시도했습니다.

UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];

반환: null:

또, 컨트롤러의 어레이를 취득하려고 하면, 다음과 같이 됩니다.

NSArray *viewControllers = self.navigationController.viewControllers;

하나의 컨트롤러만 반환되지만 루트 뷰 컨트롤러는 아닙니다.

네비게이션 컨트롤러에서 가져오려고 하면:

UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0];

반환: null:

왜 그런지 알아요?루트 뷰 컨트롤러의 인스턴스를 가져오려면 그 밖에 무엇을 시도해 볼 수 있습니까?

감사해요.

접속을 시도하고 있는 경우rootViewControllerappDelegate를 설정합니다.이것을 시험해 보세요.

목표-C

YourViewController *rootController = (YourViewController*)[[(YourAppDelegate*)
                                   [[UIApplication sharedApplication]delegate] window] rootViewController];

재빠르다

let appDelegate  = UIApplication.sharedApplication().delegate as AppDelegate
let viewController = appDelegate.window!.rootViewController as YourViewController

스위프트 3

let appDelegate  = UIApplication.shared.delegate as! AppDelegate
let viewController = appDelegate.window!.rootViewController as! YourViewController

Swift 4.2

let viewController = UIApplication.shared.keyWindow?.rootViewController as? YourViewController

Swift 5.1 및 5.2

let viewController = UIApplication.shared.windows.first?.rootViewController as? YourViewController

목표-C

UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;

Swift 2.0

let viewController = UIApplication.sharedApplication().keyWindow?.rootViewController

스위프트 5

let viewController = UIApplication.shared.keyWindow?.rootViewController

여기서 @0x7ffffff에 의해 제안되었듯이 UINavigation Controller를 사용하면 다음과 같은 작업을 쉽게 수행할 수 있습니다.

YourViewController *rootController =
    (YourViewController *)
        [self.navigationController.viewControllers objectAtIndex: 0];

위 답변의 코드는 UINavigation 컨트롤러(사용자가 가지고 있는 경우)를 반환하며, 이것이 필요한 경우 를 사용할 수 있습니다.self.navigationController.

Swift 5 이후에는 다음 방법을 사용할 것을 권장합니다.

UIApplication.shared.windows.last?.rootViewController

를 사용합니다. last 는 top view Controller is active 를 반환합니다.

.first는 위에 창이 있어야만 동작하는 라이브러리에서 작동하지 않을 수 있습니다.

예를 들어 다음과 같습니다.Admob.광고가 표시되지 않아 시트 또는 풀스크린 커버 사용 시 아래에 숨겨진 창을 호출하고 있습니다.

메모: Navigation View에 필요한 광고를 표시하려고 합니다.표시하지 않으면 광고는 실행되지 않습니다.

예: NavigationView {View1}

도움이 됐으면 좋겠어요.

iOS 15

장면 및 일부 API가 권장되지 않는 경우(예:UIApplication.shared.keyWindow가장 보편적인 접근법은 다음과 같습니다.

let scene = UIApplication.shared.connectedScenes
    .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene

let rootViewController = scene?
    .windows.first(where: { $0.isKeyWindow })?
    .rootViewController

주의: 사용 중인 앱이 여러 개의 창/씬을 지원하는 경우 여러 개의 "root View Controller"가 있으며 이 코드는 사용자를 위한 것이 아닙니다.

특별한 이유가 없는 한 루트 컨트롤러에서 다음을 수행합니다.

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(onTheEvent:)
                                             name:@"ABCMyEvent"
                                           object:nil];

통지하고 싶은 경우:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCMyEvent"
                                                object:self];                

스위프트 3

let rootViewController = UIApplication.shared.keyWindow?.rootViewController

이 기능은 어디에서나 호출할 수 있습니다.옵션으로 반환되므로 주의해 주십시오.

/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups
var topMostVC: UIViewController? {
    var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
    while let pVC = presentedVC?.presentedViewController {
        presentedVC = pVC
    }

    if presentedVC == nil {
        print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
    }
    return presentedVC
}

이 기능은 다음 항목에 표준 기능으로 포함되어 있습니다.

https://github.com/goktugyil/EZSwiftExtensions

Swift 3: Chage View Controller(Out Segue)를 사용하여 AnyObject Use: Identity MainPageViewController(Identity MainPageViewController on Target ViewController)를 전송합니다.

let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController

var mainPageNav = UINavigationController(rootViewController: mainPage)

self.present(mainPageNav, animated: true, completion: nil)

또는 뷰 컨트롤러를 변경하여 데이터를 전송하려는 경우

let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController

let dataToSend = "**Any String**" or  var ObjectToSend:**AnyObject** 

mainPage.getData = dataToSend 

var mainPageNav = UINavigationController(rootViewController: mainPage)

self.present(mainPageNav, animated: true, completion: nil)  

언급URL : https://stackoverflow.com/questions/12418177/how-to-get-root-view-controller

반응형