到目前为止,我已经可以使用以下代码可靠地获取最顶层(可见的)viewController:

UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
while (topController.presentedViewController) {
    topController = topController.presentedViewController;
}
//topController.class now contains the name of my top viewController
//I can, for example, check if my contact list view is visible to the user with:
if (topController.class == [ContactViewController class]) {
    [viewTitle setText:@"Contacts"];
}


这非常容易,而且使用起来也很棒。我的问题是我尝试检测以下类是否为顶级viewController

@interface GalleryViewController : UIViewController <UITextFieldDelegate, UICollectionViewDelegate, UICollectionViewDataSource>


现在,topController.class不等于[GalleryViewController class],就像我所有其他viewControllers一样。相反,当我使用调试器检查值时,它是带有随机内存地址的(_UIModalItemsPresentingViewController *)(所有其他viewController都显示为带有随机内存地址的(Class)ContactViewController)。

为什么这个特定的类出现这么奇怪的名字,是因为定义,还是其他?此外,如何才能正确地获得最高的viewController?

最佳答案

您需要确保使用此代码段实际上位于最顶部的窗口上

UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {
    return win1.windowLevel - win2.windowLevel;
}] lastObject];

关于ios - 当实现多个其他类时,如何获取最顶层的viewController?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24059817/

10-12 14:50
查看更多