programing

루트 뷰 컨트롤러를 얻는 방법?

nasanasas 2020. 8. 26. 07:57
반응형

루트 뷰 컨트롤러를 얻는 방법?


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

나는 그 접근법을 시도했다.

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 및 4.2

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

루트 뷰 컨트롤러에 액세스하는 짧은 방법입니다.

목표 C

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

스위프트 2.0

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

Objective-C 형식 :

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

Swift 2 형식 :

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

Swift 3 및 4 형식 :

let objViewController =  UIApplication.shared.keyWindow?.rootViewController

제안으로 여기 @의 0x7fffffff에 의해 당신이 UINavigationController가있는 경우, 할 쉽게 할 수 있습니다 :

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

위 답변의 코드는 UINavigation 컨트롤러 (있는 경우)를 반환하며 이것이 필요한 경우 self.navigationController.


정당한 이유가 없다면 루트 컨트롤러에서 다음을 수행하십시오.

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

알림을 받으려는 경우 :

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

신속한 방법으로 어디에서나 호출 할 수 있으며 선택 사항을 반환하므로 조심하십시오.

/// 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


스위프트 3

let rootViewController = UIApplication.shared.keyWindow?.rootViewController


Swift 3 : Segue없이 ViewController를 변경하고 AnyObject 사용 : 대상 ViewController의 Identity MainPageViewController

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)  

let view:UIView = UIView()

view.frame = CGRect(x:0, y:0, width:UIApplication.shared.statusBarFrame.width, height:UIApplication.shared.statusBarFrame.height

view.backgroundColor = UIColor.init(named: "yourColor")
UIApplication.shared.keyWindow!.rootViewController?.view.addSubview(view)

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

반응형