日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

IOS8如何获取当前UIViewController

發布時間:2024/9/30 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS8如何获取当前UIViewController 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

百度中有一大把獲取當前UIViewController的代碼,但是在ios8一旦present之后就拿不到了,在百度找了一大推都是沒用的東西,后來翻墻找老外,有老外發現了這個問題,但是給出的解決方案也不盡人意,最后筆者在實際解決中一次偶然機會發現了這個問題。

首先是ios7下面的代碼: //獲取當前屏幕顯示的viewcontroller - (UIViewController *)getCurrentVC { UIViewController *result = 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; } } } UIView *frontView = [[window subviews] objectAtIndex:0]; id nextResponder = [frontView nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) result = nextResponder; else result = window.rootViewController; return result; }

IOS8下面獲取當前VC代碼如下(兼容ios7):

+(UIViewController*)getCurrentKeyController {UIViewController *result;UIWindow *topWindow = [[[UIApplication sharedApplication] delegate] window];NSLog(@"%@",[[UIApplication sharedApplication] windows]);if (topWindow.windowLevel != UIWindowLevelNormal){NSArray *windows = [[UIApplication sharedApplication] windows];for(topWindow in windows){if (topWindow.windowLevel == UIWindowLevelNormal)break;}}id lenderClass = objc_getClass("UILayoutContainerView"); // 通過字符串名字,獲取類id nextResponder;UIView *rootView = [[topWindow subviews] objectAtIndex:0];if(IsIOS8&&![rootView isMemberOfClass:[lenderClass class]]){NSArray *arr = [rootView valueForKey:@"subviewCache"];if(arr.count>0){UIView *v = [arr objectAtIndex:0];nextResponder = [v nextResponder];}else{nextResponder = [[[rootView subviews] objectAtIndex:0] nextResponder];}}else{nextResponder = [rootView nextResponder];}if ([nextResponder isKindOfClass:[UIViewController class]]){result = nextResponder;}else if ([topWindow respondsToSelector:@selector(rootViewController)] && topWindow.rootViewController != nil){result = topWindow.rootViewController;}else{NSAssert(NO, @"ShareKit: Could not find a root view controller. You can assign one manually by calling [[SHK currentHelper] setRootViewController:YOURROOTVIEWCONTROLLER].");}return result; }

比起直接分享代碼,筆者更愿意跟大家分享我解決這個問題的過程和思路

  • ios7下面 window 的subview最上面一層一定是UILayoutContainerView 這可以讓我捕獲到viewcontroller ios8下面是一個過度的UITransitionView 捕獲不到VC
    這里面比較復雜 我那天搞了一個下午 我猜測蘋果的用意應該是不允許今后隨意捕捉用戶界面 給用戶一個干凈的體驗環境。

  • UILayoutContainerView(容器view)這個在api只有class 看不到任何接口~ UITransitionView(過度view)這個連api都進不去。

  • 在IOS7下UIApplication的Window的subView的第一個view一定是UILayoutContainerView,而它的nextResponder就是一個ViewController,這是為什么能給通過Window找到ViewController的原因。在ios8中,一旦使用了presentViewController,而presentViewController的UIApplication的Window的subView的第一個view就變成了UITransitionView,它的nextResponder還是一個Window,這樣看起來似乎有一種Window與UITransitionView循環的情況,筆者也不清楚蘋果是怎么做到的。
  • 后來我發現,在IOS8之下,其實Window的UILayoutContainerView被偷偷藏在了Window的subView的第一個view的一個叫做subviewCache的數組里面,于是我利用Runtime獲取了這個subviewCache數組里面的UILayoutContainerView,問題就解決了。這就是上面一段代碼
  • `id lenderClass = objc_getClass("UILayoutContainerView"); // 通過字符串名字,獲取類id nextResponder;UIView *rootView = [[topWindow subviews] objectAtIndex:0];if(IsIOS8&&![rootView isMemberOfClass:[lenderClass class]]){NSArray *arr = [rootView valueForKey:@"subviewCache"];if(arr.count>0){UIView *v = [arr objectAtIndex:0];nextResponder = [v nextResponder];}else{nextResponder = [[[rootView subviews] objectAtIndex:0] nextResponder];}}

    加了一個判斷的原因。


    [歡迎讀者指出不足之處,轉載請注明出處。]

    總結

    以上是生活随笔為你收集整理的IOS8如何获取当前UIViewController的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 免费黄色片子 | 国产91精品久久久久久久 | 丁香在线视频 | 老牛影视一区二区三区 | 香蕉视频在线免费播放 | 免费成人深夜夜行网站视频 | 美国av片| av网站地址 | 亚洲精品久久视频 | 亚洲码欧美码一区二区三区 | 日本久久久久久久久久 | 欧美乱妇在线观看 | 日韩精品免费电影 | 法国少妇愉情理伦片 | 日本一本久久 | 成人黄色在线观看 | 免费看黄在线网站 | 高清毛片aaaaaaaaa片 | 色蜜桃av| 亚洲精品国产suv | 亚洲日本视频在线观看 | 720url在线观看免费版 | 亚洲欧美一区二区三区不卡 | 日韩一区二区三区免费 | 国产日韩精品一区 | 18p在线观看 | 精品婷婷色一区二区三区蜜桃 | 无码国产精品一区二区色情男同 | 污网站在线播放 | 乌克兰性极品xxxhd | 亚洲精品久久久久av无码 | 欧美福利视频 | 中文字幕乱码在线 | 国产最爽的乱淫视频国语对白 | 免费三级大片 | 日本aa视频| va在线观看 | 国产在线欧美在线 | 中国老熟女重囗味hdxx | 午夜影院久久久 | 好吊色免费视频 | 免费黄色片子 | 在线看片网址 | 免费成人在线视频观看 | 91爱爱com | 国语对白对话在线观看 | 青青草偷拍视频 | 日本色视| 福利资源在线观看 | 欧美午夜视频在线观看 | 欧美鲁| 欧美影院一区二区 | 欧美成人乱码一区二区三区 | 日本午夜网 | 肉大榛一进一出免费视频 | 国模无码视频一区二区三区 | 香蕉综合在线 | 国产美女作爱视频 | 黄色网址进入 | 在线播放日韩 | 美女大逼 | japanese24hdxxxx中文字幕 | 精品国模一区二区三区 | 国产一区成人 | 一级特毛片 | 久久在草 | 欧美视频导航 | 日本五十熟hd丰满 | 国产97av| 久久不射影院 | 永久黄色网址 | 日本青草视频 | 日韩国产一区二区三区 | 香蕉视频链接 | 久草免费福利 | 久久精品国产99国产 | 中文字幕在线视频一区二区三区 | 人人妻人人澡人人爽精品欧美一区 | 中文亚洲av片不卡在线观看 | 久久久久久久网站 | 91欧美大片 | 久久国产精品一区二区三区 | 狠狠操2019| 毛片3 | 成人av免费在线播放 | 日韩在线视频免费观看 | 视频黄页在线观看 | 在线视频一二区 | 国产在线久久久 | www亚洲| 日韩欧美一 | 久久乐视频 | 亚洲成人第一区 | 国精品一区二区 | 国产精品国产成人国产三级 | 91精品视频一区二区三区 | youjizz日韩 | 成年女人18级毛片毛片免费 | 国产精品系列在线 |