如何在iOS上找到最顶层的视图控制器

285

我遇到了几种情况,需要找到“最上层”的视图控制器(负责当前视图的视图控制器),但没有找到方法。

基本上,这个挑战是这样的:假设一个类不是视图控制器(或视图)[并且没有活动视图的地址],也没有传入最上面视图控制器的地址(或者比如导航控制器的地址),那么是否可能找到该视图控制器呢?(如果可以,怎么实现?)

或者,如果找不到它,是否可能找到最上层的视图?


那么你的意思是说这是不可能的。 - Hot Licks
@Daniel 不,我的意思是你的代码似乎需要重新设计,因为你很少需要知道这个。此外,“最顶层”的概念只在特定情况下有效,即使在那种情况下也不总是有效。 - Dave DeLong
@Daniel,我误读了您的问题。 尝试回答此问题时有很多情况需要考虑。这取决于您的视图控制器流程。 @Wilbur的答案应该是追踪它的好起点。 - Deepak Danduprolu
4
@Daniel:添加第二个UIWindow 对于警报视图类似的覆盖效果很有效。 - Wilbur Vandrsmith
是的,UIWindow似乎是实现警报的方法。这并不能解决找出最上层视图控制器(想要将其放在顶部的位置)的另一个问题,但我想这些问题需要分别处理。 - Hot Licks
显示剩余2条评论
42个回答

-2
如果根控制器是一个导航控制器,找到顶部可见控制器的正确方法是:
UIViewController *rootVC = [[UIApplication sharedApplication] keyWindow].rootViewController;
if ([rootVC respondsToSelector:@selector(visibleViewController)])
{
    UIViewController *topVC = [(UINavigationController *)rootVC visibleViewController];
    // do your thing with topVC
}

这是来自UINavigationController.h的摘录:
@property(nonatomic,readonly,retain) UIViewController *topViewController; // The top view controller on the stack.
@property(nonatomic,readonly,retain) UIViewController *visibleViewController; // Return modal view controller if it exists. Otherwise the top view controller.

-3

你应该使用:

[UIApplication sharedApplication].window.rootViewController;

当在[UIApplication sharedApplication].keyWindow上有一个UIActionSheet时,不应该像this answer中提到的那样使用keyWindow。


2
如果能解释为什么它比其他许多回答更好,那么这将是一个更好的答案。 - combinatorial
我希望我的编辑能够告诉你如何进行建设性分析。 - Infinite Recursion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接