如何检查特定的UIViewController视图当前是否可见?

Pau*_*aul 48 iphone objective-c

可能重复:
如何判断UIViewController的视图是否可见

我正在开发一个应用程序来处理来自网络的持续传入数据流,并为用户提供许多不同的UIView来查看该数据.

当某些模型数据根据来自网络的传入流进行更新时,我访问相关的UIViewController或UITableViewController,并在其上执行-setNeedsDisplay(在UIViewController的情况下)或-reloadData(在UITableViewController的情况下).

有没有办法检查当前是否正在显示给定的UIView(除了刚被加载)以便我只做--setNeedsDisplay或-reloadData如果用户当前正在查看该UIView?看起来在用户当前没有看到的视图上调用-setNeedsDisplay或reloadData会浪费处理能力,并且不利于电池寿命.当用户最终切换到之前已更新的视图时,在-viewWillAppear上执行-setNeedsDisplay或reloadData会更有意义.

谢谢

Pau*_*aul 135

在做了一些研究之后,我在这里发布的另一个问题中找到了这个答案......这似乎是最好的方法......

如果视图当前可见,则视图的窗口属性为非零,因此请检查视图控制器中的主视图:

if (viewController.isViewLoaded && viewController.view.window){
    // viewController is visible
}
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚编辑[另一个问题](http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible/2777460#2777460)也先检查isViewLoaded以避免意外加载上面这段代码的视图.进行测试:`if(viewController.isViewLoaded && viewController.view.window)...` (5认同)
  • 这将为viewControllers提供误报,这些viewControllers受到其他模态显示的viewControllers的阻碍 - >不正确.这样做是可靠的检查viewController是不可见的,但不是相反的方式. (2认同)

Pet*_*ese 14

将它添加到您的控制器或UIViewController的子类,然后您可以进一步子类化.使用属性或变量访问它:

- (void)viewDidAppear:(BOOL)animated
{
 [super viewDidAppear:animated];
 visible = YES;
}

- (void)viewWillDisappear:(BOOL)animated
{
 visible = NO;
 [super viewWillDisappear:animated];
}
Run Code Online (Sandbox Code Playgroud)