目前,我按以下方式设置了导航堆栈:
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
选择器不执行出现在我面前..谢谢!
答案 0 :(得分:6)
visibleViewController
是一个属性,它返回当前可见的控制器,而不是返回YES
或NO
的布尔属性,具体取决于当前控制器是否可见。只要屏幕上有一个可见的视图控制器 - 任何控制器 - 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进行比较,看看它们是否相同。