我正在开发一个应用程序来处理来自网络的持续传入数据流,并为用户提供了许多不同的UIView来查看该数据。
当根据来自网络的传入流更新某些模型数据时,我访问相关的UIViewController或UITableViewController,并在其上执行-setNeedsDisplay(在UIViewController的情况下)或-reloadData(在UITableViewController的情况下)。 / p>
有没有办法检查当前是否正在显示给定的UIView(除了刚加载之外),这样如果用户当前正在查看该UIView,我只会执行-setNeedsDisplay或-reloadData?看起来在用户当前没有看到的视图上调用-setNeedsDisplay或reloadData会浪费处理能力,并且不利于电池寿命。当用户最终切换到之前已更新的视图时,在-viewWillAppear上执行-setNeedsDisplay或reloadData会更有意义。
由于
答案 0 :(得分:135)
在做了一些研究之后,我在这里发布的另一个问题中找到了这个答案......这似乎是最好的方法......
如果视图当前可见,则视图的窗口属性为非零,因此请检查视图控制器中的主视图:
if (viewController.isViewLoaded && viewController.view.window){
// viewController is visible
}
答案 1 :(得分:14)
将此添加到您的控制器或UIViewController的子类,然后您可以进一步子类化。使用属性或变量访问它:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
visible = YES;
}
- (void)viewWillDisappear:(BOOL)animated
{
visible = NO;
[super viewWillDisappear:animated];
}
答案 2 :(得分:-3)
为了完整起见,我想我会添加如何确定视图控制器是否显示在基于选项卡的应用程序中:
+(BOOL) isSelectedViewController:(UIViewController *)someVC;
{
myAppDelegate *appD = [[UIApplication sharedApplication] delegate];
UIViewController *selectedVC = [appD.TabBarController selectedViewController];
return selectedVC == someVC;
}