今天由于項目需要,需要獲得當前屏幕上顯示ViewController,所以上網(wǎng)找了一下,找到下面這個方法臀蛛,但使用的時候,發(fā)現(xiàn)并沒有什么卵用。原因看下面浊仆。
接下來說一下我自己實踐的方法客峭。
APP的架構(gòu)通常是 UITabBarViewController -> UINavigationController -> UIViewController.
所以我一開始的測試流程是:
UITabBarViewController ?--(push)-> ?WXPushViewController --(present)-> WXPresentViewController --(push)-> WXThreeViewController。
?showVC 按鈕是打印當前的類名抡柿。
第一步:獲取默認的UIWindow舔琅,獲取window的rootViewController
繼續(xù)判斷:如果window.rootViewController 是UITabBarViewController的話,就獲取UITabBarViewController當前選中的ViewController.
繼續(xù)判斷:如果 result 是 UINavigationController 的話洲劣,就獲取 UINavigationController 當前可見的ViewController(visibleViewController)
這里可以說一下 visibleViewController 和 topViewController的區(qū)別搏明。
topViewController代表當前navigation棧中最上層的VC,
而visibleViewController代表當前可見的VC闪檬,它可能是topViewController星著,也可能是當前topViewController present出來的VC。
到這里粗悯,基本已經(jīng)完成虚循,但是在項目中運用的時候,卻發(fā)現(xiàn)自己忽略了一種情況样傍。
那就是 UINavigationViewController --> UIViewController --(present)-> UITabBarViewController這種情況横缔,因為我在登錄完成的時候 present一個新的UITabBarViewController出來。如果我們用上面的方法去獲取當前顯示ViewController,那么獲取到的也永遠只是UITabBarViewController衫哥。原因就出在visibleViewController身上茎刚。
為了解決這個問題,我們應(yīng)該在獲取window的rootViewController的時候撤逢,就循環(huán)獲取最新的 被present 出來的ViewController,那么如何獲取被present的ViewController呢膛锭?UIViewController提供了這么一個屬性 presentedViewController 來讓你獲得被present出來的ViewController,如何循環(huán)遍歷呢蚊荣,直接加個while就可以了初狰,具體看下面代碼
到這里,全部結(jié)束互例。起碼在我的項目中目前還沒出現(xiàn)任何問題奢入,如果有問題,可以留言媳叨。全部代碼看下面:
總結(jié):
visibleViewController 和 topViewController的區(qū)別?
topViewController代表當前navigation棧中最上層的VC腥光,visibleViewController代表當前可見的VC,它可能是topViewController糊秆,也可能是當前topViewController present出來的VC武福。
presentedViewController 和 presentingViewController 的區(qū)別?
presentedViewController:The view controller that is presented by this view controlller(read-only)扩然,被本視圖控制器present出來的的視圖控制器
presentingViewController:The view controller that presented this view controller. (read-only)艘儒,present出來本視圖控制器的視圖控制器
例如:
如A-->彈出B, 則A.presentedViewController = B
B.presentingViewController = A
如果你有興趣可以上Github看看我的流程