
46.jpg
有一個(gè)這樣的需求,通過(guò)點(diǎn)擊某一個(gè)鏈接跳轉(zhuǎn)到我們的app的某一個(gè)頁(yè)面,在實(shí)現(xiàn)了跳轉(zhuǎn)功能的時(shí)候,發(fā)現(xiàn)一個(gè)這樣的bug就是當(dāng)前頁(yè)面已經(jīng)是需要跳轉(zhuǎn)的頁(yè)面,如果用戶(hù)在次點(diǎn)擊了鏈接進(jìn)行跳轉(zhuǎn),就會(huì)在次 push一個(gè)控制器,為了解決這個(gè)問(wèn)題,就需要獲取當(dāng)前app的最上面控制器是那個(gè),判讀他們是一個(gè)控制器,那直接就不需要跳轉(zhuǎn)了,廢話(huà)不多說(shuō)了,直接上代碼!
// 獲取當(dāng)前處于activity狀態(tài)的view controller
- (UIViewController *)activityViewController
{
UIViewController* activityViewController = nil;
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
if(window.windowLevel != UIWindowLevelNormal)
{
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *tmpWin in windows)
{
if(tmpWin.windowLevel == UIWindowLevelNormal)
{
window = tmpWin;
break;
}
}
}
NSArray *viewsArray = [window subviews];
if([viewsArray count] > 0)
{
UIView *frontView = [viewsArray objectAtIndex:0];
id nextResponder = [frontView nextResponder];
if([nextResponder isKindOfClass:[UIViewController class]])
{
activityViewController = nextResponder;
}
else
{
activityViewController = window.rootViewController;
}
}
return activityViewController;
}
這些代碼返回的是最上層的控制器,但不一定是當(dāng)前控制器
- 如果你是navgation 嵌套的層級(jí)并且push出來(lái)多個(gè)控制器,
UINavigationController *vc = (UINavigationController *)[self activityViewController];
UIViewController *topVC = vc.topViewController;
- 如果是model方式彈出的控制器
UIViewController *topVC = vc.visibleViewController;
這樣獲取的topVC就是最上層的控制器了!