如何检查当前是不是正在显示 UIViewController?
Posted
技术标签:
【中文标题】如何检查当前是不是正在显示 UIViewController?【英文标题】:How do I check if an UIViewController is currently being displayed?如何检查当前是否正在显示 UIViewController? 【发布时间】:2012-10-09 20:29:34 【问题描述】:如何检查 UIViewController
当前是否正在显示?
我的UIViewControllers
正在监听NSNotifications
- 即使它们未显示(即未显示)。所以我可以有 10 个UIViewController
在后台观察来自NSNotificationCenter
的NSNotifications
。当NSNotification
被UIViewController
发布和接收时,我想知道它当前是否正在显示。如果不是,我将设置一个布尔值,以便在显示视图时对其进行处理。如果它当前正在显示,我会做更多的事情,比如立即更新表格等等......
【问题讨论】:
你如何呈现视图控制器的视图? @tdubik:传统方式,如 pushViewController。我没有使用 StoryBoard 或 segues。 在这种情况下,您可以从UINavigationController
类中检查topViewController
。或者,如果您想处理多个控制器,请枚举 viewControllers
数组。
回答你的问题,你为什么不放弃NSNotifications
,创建一个名为isVisible
的BOOL
,并在调用viewDidAppear
和viewDidDisappear
时设置值?然后在您的viewWillAppear
(或任何地方)中,您只需检查您的BOOL
并放松很多复杂性。
【参考方案1】:
您需要检查您的视图控制器是否位于导航控制器的视图控制器数组堆栈的顶部。一个示例代码是,
if (self.navigationController.topViewController == self)
//the view is currently displayed
您可以在viewWillAppear
方法中使用它来检查当前视图是否可见。
【讨论】:
@DBD 的答案是一个更通用的答案,由于问题标题不是那么具体,对未来的读者会有更大的帮助。 浏览量控制器怎么样?什么是“self.nav”等价物?喜欢.. self.page..?【参考方案2】:检查它是否附着在窗口上。如果不是nil
,则它位于附加到屏幕的层次结构中(当然它可能超出屏幕边界,被其他视图覆盖或设置了隐藏标志)
if (myViewController.view.window)
// I'm attached to the window
else
// not attached to the window
【讨论】:
关闭,但是在检查视图是否在窗口中之前,您应该检查视图是否加载:if (self.isViewLoaded && self.view.window != nil) ...
@rob。是的,你是对的。如果未加载视图控制器并且您访问 view
对象,则会导致延迟加载,这可能意味着将内容加载到您还没有真正准备好使用的内存中。虽然它仍然会给出正确的答案,但它的表现并不理想。我假设只有在加载视图时才会添加通知,而不是初始化,因为永远不会附加未初始化的视图。尽管如此,这可能是一个不恰当的假设,如果没有别的,应该说明这一点。
这应该是正确的答案,整合了@robmayoff 的更改。
同意@Bill...这确实应该是公认的答案!【参考方案3】:
您可以为此在viewWillAppear
和viewWillDisappear
方法中使用标志。
【讨论】:
【参考方案4】:为什么不把viewWillDisappear中的通知监听器去掉,添加到viewWillAppear中呢?
编辑:误读了他的问题,抱歉。
建议的答案:在 viewDidDisappear 和 viewDidAppear 中设置您自己的标志 (BOOL)。
【讨论】:
这不起作用,因为它会在删除时错过所有通知。 那么如何在 viewWillDisappear 中设置一个标志 (BOOL) 以指示视图不再可见。当它收到通知时,检查标志以查看视图是否可见。 如果收到通知,我需要重新加载表格。如果它不来,那么这样做太昂贵了。此外,由于相同的原因,当视图重新出现时,无需重新加载表:数据相同且成本太高。 你的意思是当视图消失时我设置了一个标志 MYSELF?这是一个奇怪的解决方案,因为我认为Apple的API已经考虑过我可以检测到它。怎么样? 我明白你的意思;我在考虑是否将视图作为具有透明背景的模态 VC 推送,如果您认为底部视图可见或不可见。我会设置自己的标志,因为它给了我更多的控制权。我不知道 view.superview (其他答案)是否可行,但这似乎是合理的。【参考方案5】:为每个 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.
【讨论】:
【参考方案6】:我认为检查viewController.view.superview
应该可行。
【讨论】:
我不太明白。您如何进行比较?if(viewController.view.superview != nil )
问题是,您的视图可以附加到超级视图,但该超级视图可能未附加到您的窗口,因此存在潜在的漏洞,无法正常工作。
在 viewControllers 的情况下什么时候会出现这个漏洞?【参考方案7】:
重播这个问题为时已晚。
要检查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.
【讨论】:
【参考方案8】:基于检查window
属性的另一种选择
if viewController.viewIfLoaded?.window != nil
// visible
【讨论】:
以上是关于如何检查当前是不是正在显示 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章