10

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

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

+0

您如何呈现视图控制器的视图? – tdubik

+0

@tdubik:传统的方式,像pushViewController。我没有使用StoryBoard或继续使用。 – ikevin8me

+0

在这种情况下,您可以从'UINavigationController'类中检查'topViewController'。或者,如果你想处理更多的一个控制器枚举'viewControllers'数组。 – tdubik

回答

13

您需要检查您的viewcontroller位于navigationcontroller的viewcontroller数组的堆栈之上。样本代码,

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

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

+1

@ DBD的答案是一个更通用的答案,因为问题标题不是特定的,对未来的读者会更有帮助。 – Zedenem

1

为什么不移除viewWillDisappear中的通知侦听器并将它添加到viewWillAppear中?

编辑:误读他的问题,对不起。

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

+0

这不起作用,因为它会在删除所有通知时丢失。 – ikevin8me

+0

那么在viewWillDisappear中设置一个标志(BOOL)以表明视图不再可见。当它收到通知时,请检查该标志以查看视图是否可见。 – yuf

+0

如果通知来了,我需要重新加载表格。如果它不来,那么这样做太昂贵了。此外,出于同样的原因,当视图重新出现时不需要重新加载表:数据是相同的并且太昂贵。 – ikevin8me

0

我认为应该检查viewController.view.superview

+0

我不太明白。你如何做比较? – ikevin8me

+0

'if(viewController.view.superview!= nil)' – tdubik

+0

问题是,您的视图可能会附加到超级视图,但该超级视图可能未附加到您的窗口,因此存在潜在的漏洞,无法工作。 – DBD

6

检查它是否连接到窗口。如果不是nil它在层次结构中其安装到屏幕(当然也可能是关闭屏幕的界限,通过一些其他视图覆盖或有隐藏的标志)

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

关闭,但你应该在检查视图是否在窗口前检查是否加载了视图:'if(self.isViewLoaded && self.view.window!= nil)...' –

+0

@rob。是的,你是对的。如果视图控制器未加载并且您访问'view'对象,则会导致延迟加载,这可能意味着将内容加载到内存中,而您并未准备好使用它。虽然它仍然会给出正确的答案,但它会表现出不理想的表现。我假设通知只会在视图加载时才被添加,而不是初始化,因为未初始化的视图将永远不会被附加。不过这可能是一个不恰当的假设,如果没有其他的话,应该说明一个假设。 – DBD

+0

这应该是真正的答案,集成@ robmayoff的变化。 – Bill

4

您可以使用viewWillAppearviewWillDisappear方法中的标志。

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. 

} 
相关问题