web-dev-qa-db-fra.com

Obtenir le contrôleur de vue actuel du délégué de l'application

je suis nouveau à iOS. J'ai besoin de connaître le contrôleur de vue actuel du délégué de l'application .. Je n'ai aucune idée de cela et je ne sais pas le mettre en œuvre. J'utilise ce code pour l'implémenter, mais il renvoie des valeurs null . J'ai suivi ce lien- Obtenir le contrôleur de vue actuel du délégué de l'application (modal est possible) besoin d'aide.

22
user3459648

Voici ce que j'utilise pour trouver le contrôleur de vue actuel avec lequel l'utilisateur est le plus susceptible d'interagir:

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

Ensuite, chaque fois que j'ai besoin du contrôleur de vue actuel depuis n'importe où dans l'application, utilisez simplement:

[UIViewController currentViewController]
59
jjv360

Voici quelques fonctions statiques/de classe dans Swift que je garde dans une classe d’utilitaire et qui peuvent vous aider:

// 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
}
13
Alexander Miller

Cela m'a aidé à trouver le contrôleur de vue visible. J'ai cherché des méthodes existantes et n'en ai trouvé aucune. Alors j'ai écrit ma propre coutume.

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

Et exemple d'utilisation:

-(void)someMethod
{
    id currentVC = [self getCurrentViewController];
        if (currentVC)
        {
            NSLog(@"currentVC :%@",currentVC);
        }
}
5
Abdusha M A
UIViewController* actualVC = [anyViewController.navigationController.viewControllers lastObject];
4
Reconquistador

Cela dépend de la façon dont vous configurez votre interface utilisateur. Vous pouvez éventuellement obtenir votre rootViewController et vous déplacer dans la hiérarchie s'il est configuré de cette manière.

UIViewController *vc = self.window.rootViewController;
4
thomasdclark

Je reçois le contrôleur racine et puis itérer à travers les VC présentés:

 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];
3
Jorge Arimany

Version rapide de l'excellente réponse de jjv360, .__ (je me suis débarrassé de certains retours redondants, et je pense que Swift est plus lisible)

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 vous AppDéléguer,

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

| * | Obtenir le contrôleur de vue visible à partir du contrôleur de vue de navigation

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

| * | Présentation à partir du contrôleur de vue visible

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

C'est la meilleure solution que j'ai encore essayée

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

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

    return topController;
}
1
Mayur Deshmukh

J'ai trouvé cela et cela fonctionne très bien pour moi pour tous les types de segments et de contrôleurs de vue. C'est très simple et court aussi, c'est gentil.

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

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

return topViewController; }
0
mdimarca

J'utilise ce 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

// dans chaque ViewController que vous souhaitez détecter

@implementation SomeViewController

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

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

}
0
user3459648

Fonction Swift 4.0 Global Alert : - 

1.Faire une classe Util .Swift distincte et donner le nom 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. Utilisez-le n'importe où dans les contrôleurs de vue latérale ou à partir d'objets d'interface utilisateur: -

FCommonUtils.alert(message: "Test Message")

Il s'agit du moyen le plus simple et le plus simple d'implémenter une fonctionnalité d'alerte globale dans les applications iOS. Bonne codage !! ;)

0
Abhimanyu Rathore