在一個頁面中,如果要判斷當前頁面是不是在最頂部顯示可以做判斷
BOOL currentVCIsTopmost = (self == self.navigationController.topViewController &&
(!self.presentedViewController || [self.presentedViewController isKindOfClass:UIAlertController.class]))
// if (self.presentedViewController == nil), [self.presentedViewController isKindOfClass:UIAlertController.class] == nil
分析原因:
- 當前控制器
self
是棧頂控制器才有可能是最頂部顯示的頁面。 - 在當前控制器是棧頂控制器的情況下:
1> 如果當前沒有modal方法彈出的控制器即self.presentedViewController == nil
, 那么當前就是頂部。
2> 如果當前有modal方法彈出的控制器即presentedViewController != nil
, 則需要判斷是否是UIAlertController
。
presentedViewController 的秘密
假設rootViewController為UITabBarController類型的控制器, UITabBarController的子控制器是UINavigationController類型的控制器,下面三種情況都可以彈出頁面。
UITabBarController *tabVC = [UIApplication sharedApplication].delegate.window.rootViewController;
// 第1種: UITabBarController
[tabVC presentViewController: nextController animated:YES completion:nil];
// 第2種:UINavigationController
[tabVC.selectedViewController presentViewController:nextController animated:YES completion:nil];
// 第3種:UIViewController
[self presentViewController: nextController animated:YES completion:nil];
- 用UITabBarController來presentViewController,結果為:
self.presentedViewController 的值為: nextController;
self.navigationController.presentedViewController的值為: nextController;
tabVC.presentedViewController的值為: nextController;
- 用UINavigationController來presentViewController,結果同上。
- 用UIViewController來presentViewController,結果同上。