我有一个标签栏应用程序,有许多视图。有没有办法知道一个特定的UIViewController当前在UIViewController中是可见的?(寻找物业)
当前回答
我在uiviewcontroller。h中找到了这些函数。
/*
These four methods can be used in a view controller's appearance callbacks to determine if it is being
presented, dismissed, or added or removed as a child view controller. For example, a view controller can
check if it is disappearing because it was dismissed or popped by asking itself in its viewWillDisappear:
method by checking the expression ([self isBeingDismissed] || [self isMovingFromParentViewController]).
*/
- (BOOL)isBeingPresented NS_AVAILABLE_IOS(5_0);
- (BOOL)isBeingDismissed NS_AVAILABLE_IOS(5_0);
- (BOOL)isMovingToParentViewController NS_AVAILABLE_IOS(5_0);
- (BOOL)isMovingFromParentViewController NS_AVAILABLE_IOS(5_0);
也许上面的函数可以检测ViewController是否出现。
其他回答
你想要使用UITabBarController的selectedViewController属性。所有附加到标签栏控制器的视图控制器都有一个tabBarController属性集,所以你可以在任何视图控制器的代码中:
if([[[self tabBarController] selectedViewController] isEqual:self]){
//we're in the active controller
}else{
//we are not
}
上述解决方案存在几个问题。如果你正在使用,例如,一个UISplitViewController,主视图总是会返回true
if(viewController.isViewLoaded && viewController.view.window) {
//Always true for master view in split view controller
}
相反,采用这种简单的方法似乎在大多数情况下都很有效,如果不是所有情况:
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
//We are now invisible
self.visible = false;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
//We are now visible
self.visible = true;
}
XCode 6.4, iOS 8.4, ARC启用
显然有很多种方法。对我有效的方法如下:
@property(nonatomic, readonly, getter=isKeyWindow) BOOL keyWindow
这可以在任何视图控制器中以以下方式使用,
[self.view.window isKeyWindow]
如果你在-(void)viewDidLoad中调用这个属性,你得到0,然后如果你在-(void)viewDidAppear:(BOOL)animated后调用这个属性,你得到1。
希望这能帮助到一些人。谢谢!欢呼。
如果你正在使用一个导航控制器,只是想知道你是否在活动和最顶层的控制器,那么使用:
if navigationController?.topViewController == self {
// Do something
}
这个答案是基于@mattdipasquale的评论。
如果您有一个更复杂的场景,请参阅上面的其他答案。
如果当前视图是可见的,视图的window属性是非空的,所以检查视图控制器中的主视图:
调用view方法会导致视图被加载(如果它没有被加载),这是不必要的,也可能是不希望看到的。最好先检查一下它是否已经加载了。我添加了对isViewLoaded的调用来避免这个问题。
if (viewController.isViewLoaded && viewController.view.window) {
// viewController is visible
}
自从iOS9以来,这变得更容易了:
if viewController.viewIfLoaded?.window != nil {
// viewController is visible
}
或者如果你有一个UINavigationController管理视图控制器,你可以检查它的visibleViewController属性。
推荐文章
- 如何更改导航栏上“后退”按钮的标题
- 我如何获得iOS 7默认的蓝色编程?
- UITapGestureRecognizer破坏UITableView didSelectRowAtIndexPath
- 在Objective-C中@property保留,赋值,复制,非原子
- 6.5英寸屏幕的App store截图大小是多少?
- 我如何在NSAttributedString中创建一个可点击的链接?
- iOS测试/规格TDD/BDD以及集成和验收测试
- 停止UIWebView垂直“弹跳”?
- 启动屏幕故事板不显示图像
- 是否可以为iPhone应用程序(如YouTube和地图)注册一个基于http+域的URL方案?
- 模拟器错误fbssystemservicdomain代码4
- 改变UISegmentedControl的字体大小
- 我可以强制UITableView隐藏分隔符之间的空单元格吗?
- 获取用户当前位置/坐标
- 获得推送通知,而应用程序在前台iOS