我有一个标签栏应用程序,有很多视图。 有没有办法知道UIViewController中当前是否可以看到特定的UIViewController ? (寻找房产)


#1楼

你可以通过window属性来检查它

if(viewController.view.window){// view visible}else{// no visible}

#2楼

如果您正在使用UINavigationController并且还想处理模态视图,那么我使用以下内容:

#import <objc/runtime.h>UIViewController* topMostController = self.navigationController.visibleViewController;
if([[NSString stringWithFormat:@"%s", class_getName([topMostController class])] isEqualToString:@"NAME_OF_CONTROLLER_YOURE_CHECKING_IN"]) {//is topmost visible view controller
}

#3楼

我用于模态呈现视图控制器的方法是检查所呈现的控制器的类。 如果呈现的视图控制器是ViewController2那么我将执行一些代码。

UIViewController *vc = [self presentedViewController];if ([vc isKindOfClass:[ViewController2 class]]) {NSLog(@"this is VC2");
}

#4楼

上述解决方案存在一些问题。 例如,如果您正在使用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 invisibleself.visible = false;
}- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated];//We are now visibleself.visible = true;
}

#5楼

为了我的目的,在容器视图控制器的上下文中,我发现了

- (BOOL)isVisible {return (self.isViewLoaded && self.view.window && self.parentViewController != nil);
}

效果很好。


#6楼

对于超全屏或过度上下文模式显示,“可见”可能意味着它位于视图控制器堆栈的顶部或仅可见但被另一个视图控制器覆盖。

要检查视图控制器“是顶视图控制器”是否与“可见”完全不同,您应该检查视图控制器的导航控制器的视图控制器堆栈。

我写了一段代码来解决这个问题:

extension UIViewController {public var isVisible: Bool {if isViewLoaded {return view.window != nil}return false}public var isTopViewController: Bool {if self.navigationController != nil {return self.navigationController?.visibleViewController === self} else if self.tabBarController != nil {return self.tabBarController?.selectedViewController == self && self.presentedViewController == nil} else {return self.presentedViewController == nil && self.isVisible}}
}

#7楼

如果视图当前可见,则视图的窗口属性为非零,因此请检查视图控制器中的主视图:

调用视图方法会导致视图加载(如果未加载),这是不必要的并且可能是不合需要的。 最好首先检查它是否已经加载。 我已经添加了对isViewLoaded的调用以避免这个问题。

if (viewController.isViewLoaded && viewController.view.window) {// viewController is visible
}

或者,如果您有管理视图控制器的UINavigationController,则可以检查其visibleViewController属性。

另外,在iOS 9(或更高版本)的Swift中:

if viewController.viewIfLoaded?.window != nil {// viewController is visible
}

#8楼

您想使用UITabBarControllerselectedViewController属性。 附加到选项卡栏控制器的所有视图控制器都有一个tabBarController属性集,因此您可以从任何视图控制器的代码中:

if([[[self tabBarController] selectedViewController] isEqual:self]){//we're in the active controller
}else{//we are not
}

#9楼

我根据@ progrmr的回答快速扩展了。

它允许您轻松检查UIViewController是否在屏幕上,如下所示:

if someViewController.isOnScreen {// Do stuff here
}

扩展名:

//
//  UIViewControllerExtension.swift
//import UIKitextension UIViewController{var isOnScreen: Bool{return self.isViewLoaded() && view.window != nil}
}

#10楼

我在UIViewController.h找到了这些函数。

/*These four methods can be used in a view controller's appearance callbacks to determine if it is beingpresented, dismissed, or added or removed as a child view controller. For example, a view controller cancheck 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是否出现。


#11楼

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。

希望这有助于某人。 谢谢! 干杯。


#12楼

对于那些寻找Swift 2.2版本答案的人:

if self.isViewLoaded() && (self.view.window != nil) {// viewController is visible
}

斯威夫特3

if self.isViewLoaded && (self.view.window != nil) {// viewController is visible
}

#13楼

如果您正在使用导航控制器并且只想知道您是否在活动最顶层控制器中,那么使用:

if navigationController?.topViewController == self {// Do something
}

这个答案基于@mattdipasquale的评论。

如果您有更复杂的情况,请参阅上面的其他答案。


#14楼

我需要这个来检查视图控制器是否是当前查看的控制器,我通过检查是否有任何呈现的视图控制器或通过导航器推送它,我发布它以防任何人需要这样的解决方案:

if presentedViewController != nil || navigationController?.topViewController != self {//Viewcontroller isn't viewed
}else{// Now your viewcontroller is being viewed
}

#15楼

我在Swift 5中使用这个小扩展,这使得它很容易检查任何UIView成员的对象。

extension UIView {var isVisible: Bool {guard let _ = self.window else {return false}return true}
}

然后,我只是将它用作简单的if语句检查...

if myView.isVisible {// do something
}

我希望它有所帮助! :)


#16楼

这是@ progrmr作为UIViewController类别的解决方案:

// UIViewController+Additions.h@interface UIViewController (Additions)- (BOOL)isVisible;@end// UIViewController+Additions.m#import "UIViewController+Additions.h"@implementation UIViewController (Additions)- (BOOL)isVisible {return [self isViewLoaded] && self.view.window;
}@end

如何判断UIViewController的视图是否可见相关推荐

  1. 【转】判断UIViewController是否正在显示

    最近做一个项目,要判断某个ViewController是否正在与用户交互.显示,百度了一下,这篇文章解决了我的问题,故转之:http://edsioon.me/if-uiviewcontroller- ...

  2. UIViewController加载过程

    UIViewController是视图和数据的桥梁,UIViewController是所有controller的基类,ios内置了很多试图控制器,如导航控制器,tableViewController等 ...

  3. 【iOS面试粮食】UI视图—iOS事件的传递机制

    iOS的事件分为3大类型 Touch Events(触摸事件) Motion Events(运动事件,比如重力感应和摇一摇等) Remote Events(远程事件,比如用耳机上得按键来控制手机) 在 ...

  4. Sql Server中判断表或者数据库是否存在

    SQL Server中判断数据库是否存在: 法(一): select * From master.dbo.sysdatabases where name='数据库名' 法(二): if db_id(' ...

  5. asp.net core mvc权限控制:在视图中控制操作权限

    在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式 ...

  6. ios开发之UIView和UIViewController

    UIView 表示屏幕上的一块矩形区域,负责渲染区域的内容,并且响应该区域内发生的触摸事件.它在 iOS App 中占有绝对重要的地位,因为 iOS 中几乎所有可视化控件都是 UIView 的子类. ...

  7. jsp springmvc 视图解析器_Springmvc中多视图解析器解析问题

    最近被问到过几次关于springmvc多视图解析器解析的问题:总结一下. 1.问题: 假设我有两个jsp: WEB-INF/html/a.jsp WEB-INF/report/b.jsp 且我配置了视 ...

  8. UIViewController与UIView的关系

    haoxue 2010-11-21 21:30 iphone--UIViewController与UIView的关系 UIView翻转效果实现 新建一个view-based模板工程,在ViewCont ...

  9. 实用小技巧(一):UIScrollView中上下左右滚动方向的判断

    https://www.jianshu.com/p/93e8459b6dae 2017.06.01 01:13* 字数 674 阅读 1201评论 0喜欢 1 2017.06.01 01:13* 字数 ...

最新文章

  1. 制作计算器窗口java_Java实现的窗口计算器
  2. 页面重构-让我们的布局自适应
  3. Mycat和Mysql搭建高可用企业数据库集群
  4. pythonmatplotlib刷新_matplotlib:如何刷新figure.canvas
  5. apt-get update出现404 Not Found
  6. Machine Learning ——Homework3
  7. markdown:轻松转成html 并加载本地图片
  8. C语言--大小端转换
  9. 数字图像处理【经典女郎 Lena 图片】的使用由来~(学习之余来一个调味剂啦)
  10. 思维导图:亿图的部分使用方法
  11. 「超级右键」Mac上最强的右键菜单工具,让你效率飞起!
  12. 跑路潮来临:解散社群,深夜遁逃,卷走百亿资金
  13. 百度蜘蛛的工作原理,什么内容才容易被百度蜘蛛抓取?
  14. MTK 驱动开发---Vibrator
  15. ios 技术支持网址(URL)
  16. matlab导入word数据,如何将Excel数据导入MATLAB中?/excel数据导入word模板
  17. Paravirtualization
  18. word中鼠标没有反应,可以动但是点哪都没反应
  19. 微信jssdk已无力吐槽
  20. 用CentOS 7打造合适的科研环境 :zhuan

热门文章

  1. 解决Android Stadio 导入Android 项目,没有可运行的Module
  2. 第十、十一周项目三-警察和厨师(2)
  3. 第六周项目一-分数类的雏形(1)
  4. Win7上Git安装及配置过程
  5. k8s部署jar包_学习K8S之路.6--- 在K8S中部署Jenkins,并使用Jenkins打包jar包
  6. python基于百度接口的语音识别_Python基于百度接口的语音识别
  7. PHP学习笔记-字符串操作2
  8. iOS进阶之架构设计MVVM的理解(3)
  9. html5插件教程,HTML5教程 | HTML5 time元素
  10. ecshop 属性自动组合_【深度文章】结构设计中的荷载组合剖析(下)