134

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

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

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

戻り値: null :

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

NSArray *viewControllers = self.navigationController.viewControllers;

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

ナビゲーションコントローラーから取得しようとすると:

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

戻り値: null :

理由はありますか?ルート ビュー コントローラーのインスタンスを取得するには、他に何ができますか?

ありがとう。

4

8 に答える 8

251

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

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

スイフト3

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

スウィフト 4 & 4.2

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

スイフト 5 & 5.1 & 5.2

let viewController = UIApplication.shared.windows.first!.rootViewController as! YourViewController
于 2012-09-14T05:17:11.347 に答える
10

@ 0x7fffffff がここで提案しているように、UINavigationController があれば、より簡単に実行できます。

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

上記の回答のコードは、UINavigation コントローラー (ある場合) を返します。これが必要な場合は、self.navigationController.

于 2013-05-22T22:18:54.683 に答える
1

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

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

于 2015-11-24T04:35:14.070 に答える