博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何判断UIViewController的视图是否可见
阅读量:2291 次
发布时间:2019-05-09

本文共 5141 字,大约阅读时间需要 17 分钟。

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


#1楼

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

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

#2楼

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

#import 
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 invisible    self.visible = false;}- (void)viewDidAppear:(BOOL)animated {    [super viewDidAppear:animated];    //We are now visible    self.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,则可以检查其属性。

另外,在 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 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是否出现。


#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}

这个答案基于的评论。

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


#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

转载地址:http://kmdnb.baihongyu.com/

你可能感兴趣的文章
三大特性应用之YY出租系统的设计
查看>>
集合、异常综合应用之简易扑克牌游戏
查看>>
Java集合框架成员之HashTable类的源码分析(基于JDK1.8版本)
查看>>
多线程与高并发编程之基础知识(下)
查看>>
Java多线程之线程安全的实现方法
查看>>
多线程与高并发编程进阶(二)
查看>>
LeetCode训练营之排序
查看>>
Xcode11 xib中添加子控件位置
查看>>
HTML+CSS+JAVASCRIPT入门学习教程
查看>>
CSS学习之选择器及其优先级
查看>>
CSS三种布局模型及布局的一些注意事项
查看>>
Binary Tree Operations(II) - Path Sum and Cycle Detection
查看>>
Binary Tree Operations(III) - Convert a Binary Tree to Down-Right Representation
查看>>
Least Recently Used(LRU) Cache
查看>>
Check Soduku Solution
查看>>
Sort Colors
查看>>
Longest Consecutive Sequence
查看>>
The First Occurrence of Needle In Haystack
查看>>
Click Notes II - Click Script Language
查看>>
[转]环球企业家:思科穿越暴风眼
查看>>