it-roy-ru.com

Получите текущий контроллер представления от делегата приложения

я новичок в IOS. Мне нужно знать текущий контроллер представления от делегата приложения. Я понятия не имею об этом, и я не знаю, чтобы реализовать это. я использую этот код для упрощения этого, но он возвращает нулевые значения . Я перешел по этой ссылке- Получить контроллер текущего представления из делегата приложения (возможно модальное) нужна помощь.

22
user3459648

Это то, что я использую для нахождения текущего контроллера представления, с которым пользователь, скорее всего, взаимодействует:

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

Тогда всякий раз, когда мне нужен текущий контроллер представления из любой точки приложения, просто используйте:

[UIViewController currentViewController]
59
jjv360

Вот некоторые классовые/статические функции в Swift, которые я храню в классе Utility и могу вам помочь:

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

Это помогло мне найти видимый контроллер вида. Я искал существующие методы и не нашел ни одного. Поэтому я написал свой собственный.

-(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);
        }
}
5
Abdusha M A
UIViewController* actualVC = [anyViewController.navigationController.viewControllers lastObject];
4
Reconquistador

Это зависит от того, как вы настроили свой пользовательский интерфейс. Вы можете получить свой rootViewController и перемещаться по иерархии, если он настроен таким образом.

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

Я получаю корневой контроллер, а затем перебираю представленные ВК:

 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

Swift версия отличного ответа 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
    }
3
endavid

| * | Получите Видимый Контроллер Представления от Контроллера Представления Навигации

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

| * | Представление из контроллера Visible View

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

Это лучшее решение, которое я уже опробовал

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

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

    return topController;
}
1
Mayur Deshmukh

Я нашел это, и он отлично работает для меня для всех типов сегментов и контроллеров представления. Это очень просто и коротко, что приятно.

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

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

return topViewController; }
0
mdimarca

Я использую этот код -

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

}
0
user3459648

Функция глобального оповещения 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. Используйте его в любом месте, как это в контроллерах вида сбоку или из объектов пользовательского интерфейса: -

FCommonUtils.alert(message: "Test Message")

Это простой и самый простой способ реализовать функцию глобального оповещения в приложениях iOS. Удачного кодирования! ;)

0
Abhimanyu Rathore