如何检查当前是否正在显示UIViewController?

时间:2012-10-09 20:29:34

标签: objective-c ios uiviewcontroller nsnotificationcenter nsnotification

如何检查当前是否显示UIViewController

我的UIViewControllers正在监听NSNotifications - 即使它们没有显示(即未显示)。所以我可以在后台观察UIViewControllerNSNotifications NSNotificationCenter。当NSNotification发布并收到UIViewController时,我想知道它是否正在显示。如果不是,我将设置一个布尔值,以便在显示视图时处理它。如果它当前正在显示,我会做更多的事情,比如立即更新表等等......

8 个答案:

答案 0 :(得分:15)

您需要检查您的viewcontroller是否位于navigationcontroller的viewcontroller数组的堆栈之上。示例代码是

if (self.navigationController.topViewController == self) {
    //the view is currently displayed
}

您可以在viewWillAppear方法中使用此方法来检查当前视图是否可见。

答案 1 :(得分:6)

检查它是否附在窗口上。如果它不是nil它在层次结构中附加到屏幕上(当然它可能超出屏幕界限,被其他视图覆盖或设置隐藏标志)

if (myViewController.view.window) {
  // I'm attached to the window
} else {
  // not attached to the window
}

答案 2 :(得分:4)

您可以在viewWillAppearviewWillDisappear方法中使用标记。

答案 3 :(得分:1)

为什么不在viewWillDisappear中删除通知侦听器并将其添加到viewWillAppear中?

编辑:误读了他的问题,抱歉。

建议的答案:在viewDidDisappear和viewDidAppear中设置自己的标志(BOOL)。

答案 4 :(得分:1)

为每个ViewController指定标题,然后按照下面给出的代码获取当前ViewController的标题。

NSString *currentController = self.navigationController.visibleViewController.title;

Then check it by your title like this

if([currentController isEqualToString:@"myViewControllerTitle"]){

    //write your code according to View controller. 

}

答案 5 :(得分:0)

我认为检查viewController.view.superview应该有效。

答案 6 :(得分:0)

现在重放这个问题为时已晚。

要检查UIViewController的实例当前是否位于屏幕的顶部,或检查它是否显示在屏幕上,您可以将像这样检查:

// Get the topmost view showing on the screen as below
    UIViewController * currentVC = ((UINavigationController*)app.window.rootViewController).visibleViewController;

// Now check whether the viewcontroller you want to show is the same as the currently showing view controller.
    if (currentVC.class == myVC.class) {  // Here myVC is any/new instance of the viewcontroller you would like to check or show (if not shown).
         // If both are same then it returns true and executes this block of code.
    }

答案 7 :(得分:0)

另一种基于检查 window 属性的替代方法

if viewController.viewIfLoaded?.window != nil {
    // visible
}