我們在寫代碼時,有時會遇到:需要知道某個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" 要替換成你自定義的類名即可。
