为什么self.navigationController.visibleViewController在不可见的视图控制器上返回true

时间:2013-08-02 00:55:45

标签: iphone ios objective-c uinavigationcontroller

目前,我按以下方式设置了导航堆栈:

ViewController A - > ViewController B - > ViewController C - > ViewController D

ViewController C和ViewController D的实现代码中,如果满足以下测试,我有一个只能运行代码块的选择器

if (self.navigationController.visibleViewController)

我面临的问题是上述测试总是对ViewController C返回true。首先,我在IOS模拟器中启动我的应用程序,然后我一直向上导航到View Controller D.一旦ViewController D加载,我按下模拟器上的“home”按钮。按下主页按钮后,我再次单击我的应用程序并重新启动我的应用程序(进入前台)。现在发生的事情很奇怪,我可以看到的视图控制器是ViewController D,因为那是我最后一次的视图控制器。虽然ViewController D现在是我唯一可见的视图控制器,但上面的if语句也为ViewController C返回true! (我只想要执行ViewController D's选择器代码,这是个问题。)

所以这就引出了一个问题,它是visibleViewController究竟是什么意思?如果ViewController C's是视图控制器,我怎样才能使ViewController D选择器不执行出现在我面前..谢谢!

2 个答案:

答案 0 :(得分:6)

visibleViewController是一个属性,它返回当前可见的控制器,而不是返回YESNO的布尔属性,具体取决于当前控制器是否可见。只要屏幕上有一个可见的视图控制器 - 任何控制器 - self.navigationController.visibleViewController的检查将返回YES,因为任何非nil值传递给{{1}被视为if

检查应如下:

YES

如果当前视图控制器是导航控制器的可见视图控制器,则比较将返回if (self == self.navigationController.visibleViewController) ,否则将返回YES

答案 1 :(得分:1)

visibleViewController将始终返回一个对象(至少在您的设置中),这使得if语句始终为true - 只有当您拥有该代码的控制器在屏幕上时,它才会返回true。相反,你应该使用self.view.window作为测试。只有在屏幕上显示自己的视图时,它才会返回true。

您还可以使用self.navigationController.visibleViewController,但将其与self进行比较,看看它们是否相同。