私はiosが初めてです。アプリデリゲートから現在のView Controllerを知る必要があります。これについてはわかりませんし、これを実装することもできません。私はこのコードを使用してこれを実装していますが、null値を返します。私はこのリンクをたどりました- アプリのデリゲートから現在のView Controllerを取得します(モーダルも可能です) ヘルプが必要です。
これは、ユーザーが対話する可能性が最も高い現在のView Controllerを見つけるために使用するものです。
IViewController + Utils.h
#import <UIKit/UIKit.h>
@interface UIViewController (Utils)
+(UIViewController*) currentViewController;
@end
IViewController + Utils.m
#import "UIViewController+Utils.h"
@implementation UIViewController (Utils)
+(UIViewController*) findBestViewController:(UIViewController*)vc {
if (vc.presentedViewController) {
// Return presented view controller
return [UIViewController findBestViewController:vc.presentedViewController];
} else if ([vc isKindOfClass:[UISplitViewController class]]) {
// Return right hand side
UISplitViewController* svc = (UISplitViewController*) vc;
if (svc.viewControllers.count > 0)
return [UIViewController findBestViewController:svc.viewControllers.lastObject];
else
return vc;
} else if ([vc isKindOfClass:[UINavigationController class]]) {
// Return top view
UINavigationController* svc = (UINavigationController*) vc;
if (svc.viewControllers.count > 0)
return [UIViewController findBestViewController:svc.topViewController];
else
return vc;
} else if ([vc isKindOfClass:[UITabBarController class]]) {
// Return visible view
UITabBarController* svc = (UITabBarController*) vc;
if (svc.viewControllers.count > 0)
return [UIViewController findBestViewController:svc.selectedViewController];
else
return vc;
} else {
// Unknown view controller type, return last child view controller
return vc;
}
}
+(UIViewController*) currentViewController {
// Find best view controller
UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
return [UIViewController findBestViewController:viewController];
}
@end
次に、アプリのどこからでも現在のView Controllerが必要な場合はいつでも使用します:
[UIViewController currentViewController]
Swiftのクラス/静的関数をいくつか紹介します。これはユーティリティクラスにあり、あなたを助けることができます。
// Returns the most recently presented UIViewController (visible)
class func getCurrentViewController() -> UIViewController? {
// If the root view is a navigation controller, we can just return the visible ViewController
if let navigationController = getNavigationController() {
return navigationController.visibleViewController
}
// Otherwise, we must get the root UIViewController and iterate through presented views
if let rootController = UIApplication.sharedApplication().keyWindow?.rootViewController {
var currentController: UIViewController! = rootController
// Each ViewController keeps track of the view it has presented, so we
// can move from the head to the tail, which will always be the current view
while( currentController.presentedViewController != nil ) {
currentController = currentController.presentedViewController
}
return currentController
}
return nil
}
// Returns the navigation controller if it exists
class func getNavigationController() -> UINavigationController? {
if let navigationController = UIApplication.sharedApplication().keyWindow?.rootViewController {
return navigationController as? UINavigationController
}
return nil
}
これにより、表示可能なView Controllerを見つけることができました。既存のメソッドを検索しましたが、見つかりませんでした。それで、私は自分のカスタムを書きました。
-(id)getCurrentViewController
{
id WindowRootVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
id currentViewController = [self findTopViewController:WindowRootVC];
return currentViewController;
}
-(id)findTopViewController:(id)inController
{
/* if ur using any Customs classes, do like this.
* Here SlideNavigationController is a subclass of UINavigationController.
* And ensure you check the custom classes before native controllers , if u have any in your hierarchy.
if ([inController isKindOfClass:[SlideNavigationController class]])
{
return [self findTopViewController:[inController visibleViewController]];
}
else */
if ([inController isKindOfClass:[UITabBarController class]])
{
return [self findTopViewController:[inController selectedViewController]];
}
else if ([inController isKindOfClass:[UINavigationController class]])
{
return [self findTopViewController:[inController visibleViewController]];
}
else if ([inController isKindOfClass:[UIViewController class]])
{
return inController;
}
else
{
NSLog(@"Unhandled ViewController class : %@",inController);
return nil;
}
}
サンプル使用:
-(void)someMethod
{
id currentVC = [self getCurrentViewController];
if (currentVC)
{
NSLog(@"currentVC :%@",currentVC);
}
}
UIViewController* actualVC = [anyViewController.navigationController.viewControllers lastObject];
UIの設定方法によって異なります。 rootViewControllerを取得して、そのように設定されている場合は階層内を移動できます。
UIViewController *vc = self.window.rootViewController;
ルートコントローラーを取得し、提示されたVCを反復処理します。
UIViewController *current = [UIApplication sharedApplication].keyWindow.rootViewController;
while (current.presentedViewController) {
current = current.presentedViewController;
}
//now you can use current, for example to present an alert view controller:
[current presentViewController:alert animated:YES completion:nil];
Jjv360の優れた答えのスウィフトバージョン(冗長なリターンをいくつか取り除いたため、Swiftの方が読みやすい)
func getCurrentViewController(_ vc: UIViewController) -> UIViewController? {
if let pvc = vc.presentedViewController {
return getCurrentViewController(pvc)
}
else if let svc = vc as? UISplitViewController, svc.viewControllers.count > 0 {
return getCurrentViewController(svc.viewControllers.last!)
}
else if let nc = vc as? UINavigationController, nc.viewControllers.count > 0 {
return getCurrentViewController(nc.topViewController!)
}
else if let tbc = vc as? UITabBarController {
if let svc = tbc.selectedViewController {
return getCurrentViewController(svc)
}
}
return vc
}
AppDelegateから、
guard let rvc = self.window?.rootViewController else {
return
}
if let vc = getCurrentViewController(rvc) {
// do your stuff here
}
| * | Navigation View ControllerからVisible View Controllerを取得する
let NavVccVar = UIApplication.sharedApplication().keyWindow?.rootViewController as! UINavigationController
let ShnSrnVar = NavVccVar.visibleViewController
| * | Visible View Controllerからのプレゼンテーション
let NavVccVar = UIApplication.sharedApplication().keyWindow?.rootViewController as! UINavigationController
NavVccVar.visibleViewController!.presentViewController(NamVccVar, animated: true, completion: nil)
これは私がまだ試した中で最高のソリューションです
+ (UIViewController*) topMostController
{
UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
while (topController.presentedViewController) {
topController = topController.presentedViewController;
}
return topController;
}
私はこれを発見し、すべてのタイプのセグエとView Controllerに最適です。とてもシンプルで短いのもいいですね。
+(UIViewController *)getTopController {UIViewController * topViewController = [UIApplication sharedApplication] .keyWindow.rootViewController;
while (topViewController.presentedViewController) { topViewController = topViewController.presentedViewController; } return topViewController; }
私はこのコードを使用しています-
//in AppDelegate:
@interface AppDelegate()
{
id lastViewController;
}
@implementation AppDelegate
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleCurrentViewController) name:@"CurrentViewController" object:nil];
}
-(void)handleCurrentViewController:(NSNotification *)notification
{
if([[notification userInfo] objectForKey:@"lastViewController"])
{
lastViewController = [[notification userInfo] objectForKey:@"lastViewController"];
}
}
-(void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"last view controller is %@", [(UIViewController *)lastViewController class]);
}
@end
//検出したいすべてのViewControllerで
@implementation SomeViewController
-(void) viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] postNotificationName:@"CurrentViewController" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:self, @"lastViewController", nil]];
}
Swift 4.0グローバルアラート機能:-
1。別個のUtil .Swiftクラスを作成し、FCommonUtils.Swiftに名前を付けます:-
import Foundation
import SystemConfiguration
class FCommonUtils{
class func alert(title:String = appName, message:String) -> Void {
//make alert controller
let alert = UIAlertController(title: title,message: message,preferredStyle: UIAlertControllerStyle.alert)
//add okay button
alert.addAction(UIAlertAction.init(title: "Okay",style: .default,handler: { (action) in }))
//present it on controller
if let vc = UIApplication.shared.keyWindow?.rootViewController{
vc.present(alert, animated: true, completion: nil)
}
}
}
2。サイドビューコントローラーまたはUIオブジェクトからこのように使用します:-
FCommonUtils.alert(message: "Test Message")
これはiOSアプリ内でグローバルアラート機能を実装するためのシンプルで簡単な方法です。ハッピーコーディング!!;)