Мне всегда нравятся решения, которые включают категории, поскольку они надежны и могут быть легко использованы повторно.
Итак, я создал категорию в UIWindow. Теперь вы можете вызвать visibleViewController в UIWindow, и вы получите контроллер видимого представления, выполнив поиск по иерархии контроллеров. Это работает, если вы используете навигацию и / или контроллер панели вкладок. Если у вас есть другой тип контроллера, пожалуйста, дайте мне знать, и я могу добавить его.
UIWindow + PazLabs.h (заголовочный файл)
#import <UIKit/UIKit.h>
@interface UIWindow (PazLabs)
- (UIViewController *) visibleViewController;
@end
UIWindow + PazLabs.m (файл реализации)
#import "UIWindow+PazLabs.h"
@implementation UIWindow (PazLabs)
- (UIViewController *)visibleViewController {
UIViewController *rootViewController = self.rootViewController;
return [UIWindow getVisibleViewControllerFrom:rootViewController];
}
+ (UIViewController *) getVisibleViewControllerFrom:(UIViewController *) vc {
if ([vc isKindOfClass:[UINavigationController class]]) {
return [UIWindow getVisibleViewControllerFrom:[((UINavigationController *) vc) visibleViewController]];
} else if ([vc isKindOfClass:[UITabBarController class]]) {
return [UIWindow getVisibleViewControllerFrom:[((UITabBarController *) vc) selectedViewController]];
} else {
if (vc.presentedViewController) {
return [UIWindow getVisibleViewControllerFrom:vc.presentedViewController];
} else {
return vc;
}
}
}
@end