【问题标题】:why is self.navigationController.visibleViewController returning true on view controller that is not visible为什么 self.navigationController.visibleViewController 在不可见的视图控制器上返回 true
【发布时间】:2013-08-02 00:55:45
【问题描述】:

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

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 加载,我按下模拟器上的“主页”按钮。按下主页按钮后,我再次单击我的应用程序并重新启动我的应用程序(进入前台)。现在发生的事情很奇怪,我可见的视图控制器是ViewController D,因为那是我上次使用的视图控制器。尽管ViewController D 现在是我目前唯一可见的视图控制器,但上面的 if 语句对于ViewController C 也返回 true! (我只希望ViewController D's选择器代码被执行,这是个问题)。

所以这引出了一个问题,成为visibleViewController 到底意味着什么?如果ViewController D 是出现在我面前的视图控制器,我怎样才能使ViewController C's 选择器不执行。谢谢!

【问题讨论】:

    标签: iphone ios objective-c uinavigationcontroller


    【解决方案1】:

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

    检查应该如下:

    if (self == self.navigationController.visibleViewController)
    

    如果当前视图控制器是导航控制器的可见视图控制器,比较将返回YES,否则返回NO

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-06-06
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        • 2020-02-18
        • 2014-12-20
        相关资源
        最近更新 更多