ios objective-c delegates appdelegate

ios - Obtener el controlador de vista actual del delegado de la aplicación



uiapplication swift (12)

Aquí hay algunas funciones de clase / estáticas en Swift que mantengo en una clase de Utilidades y puedo ayudarte:

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

Soy nuevo en iOS. Necesito saber el controlador de vista actual del delegado de la aplicación. No tengo idea de esto y no sé cómo implementar esto. Estoy usando este código para simplificar esto pero devuelve valores nulos. Seguí este enlace. Obtener el controlador de vista actual del delegado de la aplicación (modal es posible) necesita ayuda.


Depende de cómo configures tu interfaz de usuario. Posiblemente puede obtener su control de control de raíz y moverse a través de la jerarquía si está configurado de tal manera.

UIViewController *vc = self.window.rootViewController;


Encontré esto y me funciona muy bien para todos los tipos de segues y controladores de vista. Es muy simple y corto, lo que es bueno.

+ (UIViewController *) getTopController {UIViewController * topViewController = [UIApplication sharedApplication] .keyWindow.rootViewController;

while (topViewController.presentedViewController) { topViewController = topViewController.presentedViewController; } return topViewController; }


Esta es la mejor solución que he probado hasta ahora.

+ (UIViewController*) topMostController { UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; while (topController.presentedViewController) { topController = topController.presentedViewController; } return topController; }


Esto es lo que uso para encontrar el controlador de vista actual con el que es más probable que el usuario interactúe con:

UIViewController + Utils.h

#import <UIKit/UIKit.h> @interface UIViewController (Utils) +(UIViewController*) currentViewController; @end

UIViewController + 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

Luego, cuando necesite el controlador de vista actual desde cualquier lugar de la aplicación, simplemente use:

[UIViewController currentViewController]


Esto me ayudó a encontrar el controlador de vista visible. Busqué los métodos existentes y no encontré ninguno. Así que escribí mi propia costumbre.

-(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; } }

Y muestra de uso:

-(void)someMethod { id currentVC = [self getCurrentViewController]; if (currentVC) { NSLog(@"currentVC :%@",currentVC); } }


Obtengo el controlador raíz y luego itero a través de los VC presentados:

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];


Versión de Swift de la gran respuesta de jjv360 (me deshice de algunas devoluciones redundantes y creo que Swift es más legible)

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 }

De usted AppDelegate,

guard let rvc = self.window?.rootViewController else { return } if let vc = getCurrentViewController(rvc) { // do your stuff here }


| * | Obtener Visible View Controller desde Navigation View Controller

let NavVccVar = UIApplication.sharedApplication().keyWindow?.rootViewController as! UINavigationController let ShnSrnVar = NavVccVar.visibleViewController

| * | Presentación desde el controlador Visible View

let NavVccVar = UIApplication.sharedApplication().keyWindow?.rootViewController as! UINavigationController NavVccVar.visibleViewController!.presentViewController(NamVccVar, animated: true, completion: nil)


Estoy usando este código

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

// en cada ViewController que quieras detectar

@implementation SomeViewController -(void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] postNotificationName:@"CurrentViewController" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:self, @"lastViewController", nil]]; }


Función Swift 4.0 Global Alert : -

1.Haga una clase separada de Util .swift y nombre 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. Utilícelo en cualquier lugar como este en los controladores de vista lateral o en los objetos de la interfaz de usuario:

FCommonUtils.alert(message: "Test Message")

Esta es la forma más sencilla y sencilla de implementar la función de alerta global dentro de las aplicaciones iOS. Feliz codificacion !! ;)


UIViewController* actualVC = [anyViewController.navigationController.viewControllers lastObject];