我們在寫代碼時,有時會遇到:需要知道某個controller是否已經存在,或着,要拿到已存在的某個controller對象,這里提供一種可以獲取到你想要的controller對象,只需要傳入類名即可,廢話不多說直接上代碼:
- (UIViewController *)getActivityViewController:(NSString *)controllerName { UIViewController *topVC = [UIApplication sharedApplication].keyWindow.rootViewController; while (topVC.presentedViewController) { topVC = topVC.presentedViewController; if ([[topVC.class description] isEqualToString:@"UINavigationController"]) { UINavigationController *navi = (UINavigationController *)topVC; if (navi && navi.viewControllers && navi.viewControllers.count > 0) { NSInteger count = navi.viewControllers.count; for (NSInteger i=count-1; i>=0; i--) { UIViewController *controller = [navi.viewControllers objectAtIndex:i]; if ([[controller.class description] isEqualToString:controllerName]) { return controller; } } } } } return nil; }
如果當前存在的同一類名的controller有多個,你要拿到最新的一個可以用下面這種方法:
- (UIViewController *)getActivityViewController:(NSString *)controllerName { UIViewController *topVC = [UIApplication sharedApplication].keyWindow.rootViewController; UIViewController *resaultVC = nil; while (topVC.presentedViewController) { topVC = topVC.presentedViewController; if ([[topVC.class description] isEqualToString:@"UINavigationController"]) { UINavigationController *navi = (UINavigationController *)topVC; if (navi && navi.viewControllers && navi.viewControllers.count > 0) { NSInteger count = navi.viewControllers.count; for (NSInteger i=count-1; i>=0; i--) { UIViewController *controller = [navi.viewControllers objectAtIndex:i]; if ([[controller.class description] isEqualToString:controllerName]) { resaultVC = controller; } } } } } return resaultVC; }
當然這兩個方法的前提是,你如果是 present 出來的congtroller,並且導航控制器是 UINavigationController 類型,如果導航控制器是自定義的,那么在判斷 if ([[topVC.class description] isEqualToString:@"UINavigationController"]) 時@"UINavigationController" 要替換成你自定義的類名即可。