ルートビューコントローラーのインスタンスが必要です。
私はそれらのアプローチを試しました:
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:
なぜアイデアがありますか?ルートビューコントローラのインスタンスを取得しようとする他の方法はありますか?
ありがとう。
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
ルートビューコントローラにアクセスする短い方法。
目的C
UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;
Swift 2.
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
here by @ 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];
Swift
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
}
以下に標準機能として含まれています。
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)
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)