我有一个标签栏应用程序,有许多视图。有没有办法知道一个特定的UIViewController当前在UIViewController中是可见的?(寻找物业)
当前回答
就我的目的而言,在容器视图控制器的上下文中,我已经找到了
- (BOOL)isVisible {
return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}
工作得很好。
其他回答
如果当前视图是可见的,视图的window属性是非空的,所以检查视图控制器中的主视图:
调用view方法会导致视图被加载(如果它没有被加载),这是不必要的,也可能是不希望看到的。最好先检查一下它是否已经加载了。我添加了对isViewLoaded的调用来避免这个问题。
if (viewController.isViewLoaded && viewController.view.window) {
// viewController is visible
}
自从iOS9以来,这变得更容易了:
if viewController.viewIfLoaded?.window != nil {
// viewController is visible
}
或者如果你有一个UINavigationController管理视图控制器,你可以检查它的visibleViewController属性。
你想要使用UITabBarController的selectedViewController属性。所有附加到标签栏控制器的视图控制器都有一个tabBarController属性集,所以你可以在任何视图控制器的代码中:
if([[[self tabBarController] selectedViewController] isEqual:self]){
//we're in the active controller
}else{
//we are not
}
我在Swift 5中使用这个小扩展,它使它保持简单和容易检查UIView成员的任何对象。
extension UIView {
var isVisible: Bool {
guard let _ = self.window else {
return false
}
return true
}
}
然后,我只是用它作为一个简单的if语句检查…
if myView.isVisible {
// do something
}
我希望这能有所帮助!:)
就我的目的而言,在容器视图控制器的上下文中,我已经找到了
- (BOOL)isVisible {
return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}
工作得很好。
对于那些正在寻找Swift 2.2版本的答案的人:
if self.isViewLoaded() && (self.view.window != nil) {
// viewController is visible
}
Swift 3:
if self.isViewLoaded && (self.view.window != nil) {
// viewController is visible
}
推荐文章
- 架构i386的未定义符号:_OBJC_CLASS_$_SKPSMTPMessage",引用自:错误
- UILabel对齐文本到中心
- Objective-C中方法混合的危险是什么?
- 如何使用接口生成器创建的nib文件加载UIView
- iOS如何设置应用程序图标和启动图像
- 更改UITextField和UITextView光标/插入符颜色
- 'Project Name'是通过优化编译的——步进可能会表现得很奇怪;变量可能不可用
- 如何设置回退按钮文本在Swift
- 模拟器慢动作动画现在打开了吗?
- 如何为TableView创建NSIndexPath
- 滑动删除和“更多”按钮(就像iOS 7的邮件应用程序)
- 使UINavigationBar透明
- 如何改变推和弹出动画在一个基于导航的应用程序
- 删除/重置核心数据中的所有条目?
- setNeedsLayout vs. setNeedsUpdateConstraints和layoutIfNeeded vs. updateConstraintsIfNeeded