2014-07-18 11 views
21

sono nuovo di IOS. Devo conoscere l'attuale controller di visualizzazione dal delegato dell'app. Non ne ho idea e non so come implementarlo. sto usando questo codice toimplemnt questo ma restituisce valori nulli. Ho seguito questo collegamento- Get current view controller from the app delegate (modal is possible) bisogno di aiuto.Ottieni il controller di visualizzazione corrente dall'app delegato

+0

stai usando il controller di navigazione? altrimenti inserisci il tuo codice per capire meglio – Retro

risposta

4

Dipende da come si imposta l'interfaccia utente. È possibile ottenere il tuo rootViewController e spostarti attraverso la gerarchia se è configurato in questo modo.

UIViewController *vc = self.window.rootViewController; 
+0

ottengo il nome del controller di visualizzazione in questo modo: l'ultimo controller di visualizzazione è vc == ma voglio il nome del controller di visualizzazione. – user3459648

+0

Se si sta seguendo questo e si desidera il nome del controller, provare id vc = self.window.rootViewController; NSLog (@ "Nome controller:% @", [classe vc]); –

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

Sto usando questo code-

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

// in ogni ViewController si desidera rilevare

@implementation SomeViewController 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"CurrentViewController" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:self, @"lastViewController", nil]]; 

} 
59

Questo è quello che uso per la ricerca il controller di visualizzazione corrente che l'utente è mo st probabilmente interagire 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 

Poi ogni volta che ho bisogno del regolatore di vista corrente da qualsiasi app utilizzare semplicemente:

[UIViewController currentViewController] 
+0

Mi hai salvato la vita;) La tua soluzione funziona bene – Ali

12

Here're qualche classe/funzioni statiche in rapida che tengo in una classe di utilità e può aiutare a:

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

L'ho usato con successo con le modifiche per farlo compilare. Alcuni ri-organizzare richiesto. –

+0

@alaxandermiller, come posso usarli per ottenere i nomi dei viewcontroller come una stringa? –

5

Questo mi ha aiutato a trovare il controller della vista visibile. Ho cercato i metodi esistenti e non ho trovato nessuno. Così ho scritto il mio personalizzato.

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

E l'uso del campione:

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

versione Swift di grande risposta di jjv360, (mi sono liberato di alcuni ritorni ridondanti, e penso che Swift è più leggibile)

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 
} 

Da te AppDelegate,

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

ottengo il controller principale e poi scorrere presentato 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]; 
1

| * | Ottenere Visibile View Controller dalla Navigazione View Controller

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

| * | Presentando dalla View Controller Visibile

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

Questa è la soluzione migliore che ho provato ancora

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

    while (topController.presentedViewController) { 
     topController = topController.presentedViewController; 
    } 

    return topController; 
} 
0

Ho trovato questo e funziona benissimo per me, per tutti i tipi di segues e visualizzare i controllori. È anche molto semplice e breve, il che è bello.

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

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

return topViewController; } 
Problemi correlati