如何获取当前活动视图控制器?

6
我遇到了这个问题(Flurry分析报告了一些用户的错误,但我在我的设备和模拟器上都无法重现):
NSInvalidArgumentException:应用程序尝试以模态方式呈现活动控制器。
你知道这个错误吗?它发生在你身上了吗?
应用程序有三个按层次排序的视图:主视图控制器带有位置列表和详细视图(在错误消息中提到的CityViewController)自动在用户处于已知位置之一时呈现。每当位置显着更改时,首先关闭详细视图,然后再打开新的位置以防止此问题发生。然而,这似乎没有帮助。
CityViewController还可以作为其子级打开短信编辑器。

尝试使用persendModelView而不设置动画...我的意思是animation:NO。 - iPatel
你可以通过查看 self.view.window 来检查控制器的视图是否在屏幕上 -- 如果该视图当前不在窗口层次结构中,则该值将为 nil。 - rdelmar
3个回答

16

要获取当前可见视图,您可以使用:

[self.navigationController visibleViewController];

你需要将它转换为你正在使用的视图控制器类型吗? - UKDataGeek
如果应用程序没有使用导航控制器会发生什么? - Onder OZCAN

2

如何获取当前活动的视图控制器?答案在于使用[self.navigationController presentedViewController],而不是topViewController或其他任何内容。


你的回答中的“self”是什么?如何从应用程序的任何部分获取它? - helper
self 指的是当前类,即被推入 window.rootViewController = navigation controller 的第一个 UIViewController 子类。 - igraczech

0

如果您在某个事件触发时启动模态视图,那么似乎有可能在该视图已经处于活动状态时再次尝试显示它...


是的,这就是为什么我打算使用一些内省来检查它是否已经可见,而不是使用状态机进行跟踪,这可能需要太多的工作来保持线程安全。 - igraczech

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