iOS項(xiàng)目開發(fā)中,經(jīng)常會遇到需要知道應(yīng)用正在顯示哪個控制器的情況。比如,當(dāng)收到一條推送通知時(shí),要根據(jù)不同界面處理不同的業(yè)務(wù)邏輯,就需要知道收到通知時(shí)應(yīng)用正處于哪個界面,即獲取到應(yīng)用正在顯示的控制器。下面介紹一種方法,分別用swift和OC實(shí)現(xiàn)。
swift版:
func getCurrentVC() -> UIViewController? {
for window in UIApplication.shared.windows.reversed() {
var tempView: UIView? = window.subviews.last
for subview in window.subviews.reversed() {
if subview.classForCoder == NSClassFromString("UILayoutContainerView") {
tempView = subview
break
}
}
var nextResponder = tempView?.next
var next: Bool {
return !(nextResponder is UIViewController) || nextResponder is UINavigationController || nextResponder is UITabBarController || nextResponder?.classForCoder == NSClassFromString("UIInputWindowController")
}
while next{
tempView = tempView?.subviews.first
if tempView == nil {
return nil
}
nextResponder = tempView!.next
}
if let currentVC = nextResponder as? UIViewController {
return currentVC
}
}
return nil
}
OC版:
- (UIViewController *)getCurrentVC {
for (UIWindow *window in [UIApplication sharedApplication].windows.reverseObjectEnumerator) {
UIView *tempView = window.subviews.lastObject;
for (UIView *subview in window.subviews.reverseObjectEnumerator) {
if ([subview isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
tempView = subview;
break;
}
}
BOOL(^canNext)(UIResponder *) = ^(UIResponder *responder){
if (![responder isKindOfClass:[UIViewController class]]) {
return YES;
} else if ([responder isKindOfClass:[UINavigationController class]]) {
return YES;
} else if ([responder isKindOfClass:[UITabBarController class]]) {
return YES;
} else if ([responder isKindOfClass:NSClassFromString(@"UIInputWindowController")]) {
return YES;
}
return NO;
};
UIResponder *nextResponder = tempView.nextResponder;
while (canNext(nextResponder)) {
tempView = tempView.subviews.firstObject;
if (!tempView) {
return nil;
}
nextResponder = tempView.nextResponder;
}
UIViewController *currentVC = (UIViewController *)nextResponder;
if (currentVC) {
return currentVC;
}
}
return nil;
}
使用該方法的需要注意的地方是,需要等到控制器viewDidAppear之后才能獲取到正確的控制器