web-dev-qa-db-ja.com

ルートビューコントローラーを取得する方法は?

ルートビューコントローラーのインスタンスが必要です。

私はそれらのアプローチを試しました:

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

戻り値:null

また、コントローラーの配列を取得しようとすると:

NSArray *viewControllers = self.navigationController.viewControllers;

返されるコントローラーは1つだけですが、それは私のルートビューコントローラーではありません。

Navigation Controllerから取得しようとすると:

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

戻り値:null

なぜアイデアがありますか?ルートビューコントローラのインスタンスを取得しようとする他の方法はありますか?

ありがとう。

95
Streetboy

appDelegateで設定したrootViewControllerにアクセスしようとしている場合。これを試して:

Objective-C

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

スイフト

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

Swift

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
169
janusfidel

ルートビューコントローラにアクセスする短い方法。

目的C

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

Swift 2.

let viewController =  UIApplication.sharedApplication().keyWindow?.rootViewController
34
Chamath Jeevan

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
16

here by @ 0x7fffffffで示唆されているように、UINavigationControllerをお持ちの場合は、簡単に実行できます。

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

上記の答えのコードはUINavigationコントローラーを返します(持っている場合)。これが必要な場合は、self.navigationControllerを使用できます。

10
esp

正当な理由がない限り、ルートコントローラーで次の操作を行います。

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

そして、あなたがそれを通知したいとき:

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

Swift

let rootViewController = UIApplication.shared.keyWindow?.rootViewController

1
cybermach

それを行うための迅速な方法、あなたはどこからでもこれを呼び出すことができます、それはオプションを返すので、それについて注意してください:

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

1
Esqarrouth

Swift 3:Chgue ViewController with Segue and send 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)

またはView Controllerを変更してデータを送信する場合

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)  
1
user6857463
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)
0
Alam