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.
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]
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
}
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);
}
}
UIViewController* actualVC = [anyViewController.navigationController.viewControllers lastObject];
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;
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];
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
}
| * | 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)
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;
}
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; }
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]];
}
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 !! ;)