美文网首页
判断当前的view是不是在显示

判断当前的view是不是在显示

作者: 萧城x | 来源:发表于2015-12-07 11:52 被阅读1604次

    1.我们在非视图类中想要随时展示一个view时,需要将被展示的view加到当前view的子视图,或用当前view presentViewController,或pushViewContrller,这些操作都需要获取当前正在显示的ViewController。

    [objc] view plaincopy
    //获取当前屏幕显示的viewcontroller

    • (UIViewController *)getCurrentVC
      {
      UIViewController *result = nil;

      UIWindow * window = [[UIApplication sharedApplication] keyWindow];
      if (window.windowLevel != UIWindowLevelNormal)
      {
      NSArray *windows = [[UIApplication sharedApplication] windows];
      for(UIWindow * tmpWin in windows)
      {
      if (tmpWin.windowLevel == UIWindowLevelNormal)
      {
      window = tmpWin;
      break;
      }
      }
      }

      UIView *frontView = [[window subviews] objectAtIndex:0];
      id nextResponder = [frontView nextResponder];

      if ([nextResponder isKindOfClass:[UIViewController class]])
      result = nextResponder;
      else
      result = window.rootViewController;

      return result;
      }

    2.获取当前屏幕中present出来的viewcontroller。

    [objc] view plaincopy

    • (UIViewController *)getPresentedViewController
      {
      UIViewController *appRootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
      UIViewController *topVC = appRootVC;
      if (topVC.presentedViewController) {
      topVC = topVC.presentedViewController;
      }

      return topVC;
      }

    某些情况下,需判断当前ViewController是否正在显示,比如后台网络请求报错,我们可能只希望在发起请求的页面弹窗提示用户,当用户已经跳转到其他界面,不做弹窗,减少对用户的干扰。

    假如一个UIView对象当前正在显示,那么它的window属性肯定为非空值。虽然官方文档未说明UIView未显示时window属性的取值,但是经过简单的测试,大部分情况下UIView未显示时,window的值为空,因此依据此判断当前UIViewController是否正在显示。但是访问UIViewController的view属性时,可能会引起view加载(假如此时还未加载),这是不必要的,而且还可能引起无法预期的问题。因此在访问view属性之前,最好先检查isViewLoaded属性来避免上述问题。

    示例代码如下,在UIViewController的扩展中声明了一个isVisible方法,方便以后调用

    技术分享

    注意:UIView的官方文档中仅注明当view还未添加到window时,window属性为空;但是并未提及当window为nil时,当前view未显示。通过简单的Demo检测上文的方法可满足大部分需求,因此使用时建议进行简单测试!

    瞬间觉得自己好low 哈哈 ,但是要注意 该方法实用的条件哦!!! 不是特殊情况处理下的视图控制器,一般都能用.

    我写了一个类方法 为了调用更方便哈哈

    如下:

    +(BOOL)isCurrentViewControllerVisible:(UIViewController *)viewController
    {
    return (viewController.isViewLoaded && viewController.view.window);
    }

    相关文章

      网友评论

          本文标题:判断当前的view是不是在显示

          本文链接:https://www.haomeiwen.com/subject/yplehttx.html