iOS 獲取當(dāng)前正在顯示的ViewController

1:從UIWindow中獲取

#import "UIWindow+SHHelper.h"

@implementation UIWindow (SHHelper)

- (UIViewController*)sh_topMostController

{

//? getting rootViewController

UIViewController *topController = [self rootViewController];

//? Getting topMost ViewController

while ([topController presentedViewController]) topController = [topController presentedViewController];

//? Returning topMost ViewController

return topController;

}

- (UIViewController*)sh_currentViewController;

{

UIViewController *currentViewController = [self sh_topMostController];

while ([currentViewController isKindOfClass:[UINavigationController class]] && [(UINavigationController*)currentViewController topViewController])

currentViewController = [(UINavigationController*)currentViewController topViewController];

return currentViewController;

}

@end


2:從UIView里面獲取

//滿足一個日常的需求:在UITableviewcell里面的UIView模塊里面,調(diào)用self.navigationcontroller pushviewcontroller推入一個新的viewcontroller,需要獲取其上層的UIViewcontroller, 可以使用下面的方法:

- (UIViewController *)sh_viewController

{

UIResponder *responder = self;

while ((responder = [responder nextResponder])){

if ([responder isKindOfClass: [UIViewController class]]){

return (UIViewController *)responder;

}

}

return nil;

}

3:從UIViewController中獲取

#import "UIViewController+SHHelper.h"

@implementation UIViewController (SHHelper)

- (UIViewController*)sh_topMostController

{

UIViewController *topController = self ;

while ([self presentedViewController])

topController = [topController presentedViewController];

return topController;

}

- (UIViewController*)sh_currentViewController;

{

UIViewController *currentViewController = [self sh_topMostController];

while ([currentViewController isKindOfClass:[UINavigationController class]] && [(UINavigationController*)currentViewController topViewController])

currentViewController = [(UINavigationController*)currentViewController topViewController];

return currentViewController;

}

//我們在非視圖類中想要隨時展示一個view時,需要將被展示的view加到當(dāng)前view的子視圖,或用當(dāng)前view presentViewController,或pushViewContrller,這些操作都需要獲取當(dāng)前正在顯示的ViewController。

//獲取當(dāng)前view的UIViewController

+ (UIViewController *)sh_currentViewControllerFromcurrentView{

UIViewController *result = nil;

// 1. get current window

UIWindow * window = [[UIApplication sharedApplication] keyWindow];

if (window.windowLevel != UIWindowLevelNormal) {

NSArray *windows = [[UIApplication sharedApplication] windows];

for(UIWindow * tempWindow in windows) {

if (tempWindow.windowLevel == UIWindowLevelNormal) {

window = tempWindow;

break;

}

}

}

// 2. get current View Controller

UIView *frontView = [[window subviews] objectAtIndex:0];

id nextResponder = [frontView nextResponder];

if ([nextResponder isKindOfClass:[UIViewController class]]) {

result = nextResponder;

} else {

result = window.rootViewController;

}

return result;

}

//獲取當(dāng)前屏幕中present出來的viewcontroller。

- (UIViewController *)getPresentedViewController

{

UIViewController *appRootVC = [UIApplication sharedApplication].keyWindow.rootViewController;

UIViewController *topVC = appRootVC;

if (topVC.presentedViewController) {

topVC = topVC.presentedViewController;

}

return topVC;

}

@end


友情隨便跳轉(zhuǎn)

-(void)pushTest {? ? [self.navigationController pushViewController:D animated:YES];

NSMutableArray*tempMarr = [NSMutableArrayarrayWithArray : self.navigationController.viewControllers]; ?

??[tempMarr insertObject:C atIndex:tempMarr.count- 2];?

? ?[tempMarr removeObject:self]; //此時 的self 就是指 B ,因為在 B 中呢 ?

??[self.navigationController setViewControllers:tempMarr animated:YES];}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容