从VC取得View很容易,但有些情况下我们需要从View反向获取VC.

不过在一些特殊的场合,Cocoa库帮我们想的很周到,比如在自定义View过渡动画的时候:

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

}

系统在回调我们的animateTransition方法时,会传入一个context参数,从它我们可以轻松取得参与动画的toView,fromView以及它们对应的VC:

let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!

let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!

但不是所有情况系统都会帮你考虑的这么周到,所以有时候还得需要自己从View找到它的VC,网上有Obj-c的代码示例:

- (UIViewController *)viewController {
    for (UIView* next = [self superview]; next; next = next.superview) {
        UIResponder *nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)nextResponder;
        }
    }
    return nil;
}

我们来将其改为Swift版本,以下是第一次尝试:

func controller(view:UIView)->UIViewController?{
        for var next:UIView? = view;next != nil;next = next!.superview{
            if let nextResponder = next?.nextResponder() where nextResponder.isKindOfClass(UIViewController.self){
                return (nextResponder as! UIViewController)
            }
        }
        return nil
    }

上面的方法可以很好的完成其功能,不过编译器有警告,for如此的语法将会在将来的Swift版本中剔除,所以我们还是将其转成没有警告的代码:

func controller2(view:UIView)->UIViewController?{
        var next:UIView? = view
        repeat{
            if let nextResponder = next?.nextResponder() where nextResponder.isKindOfClass(UIViewController.self){
                return (nextResponder as! UIViewController)
            }
            next = next?.superview
        }while next != nil
        return nil
    }

正如你所见,虽然没有警告,但是代码要稍微多一些了.

最后我们可以把开始的代码替换如下:

let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!
let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!

let toVC = controller2(toView)!
let fromVC = controller2(fromView)!

最新文章

  1. 相似性度量(Similarity Measurement)与“距离”(Distance)
  2. Hive Streaming 追加 ORC 文件
  3. URL编码表,URL编码大全
  4. struts2+hibernate整合开发步骤
  5. Jar mismatch! Fix your dependencies的问题
  6. 【jdbcTemplate】使用jdbcTemplate查询的三种回调
  7. sed命令实战
  8. 阻止文件不被上传到iCloud-b
  9. 域控制器安全策略在哪里 Windows server 2008
  10. Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_PRC_CI_AS" in the equal to operation.
  11. C语言struct类型
  12. 商城项目实战 | 2.1 Android 仿京东商城——自定义 Toolbar (一)
  13. Bumblebee微服务网关的部署和扩展
  14. spring boot2 kafka
  15. 使用有序GUID:提升其在各数据库中作为主键时的性能
  16. python中os.path模块简介
  17. springboot设置session超时和session监听
  18. SpringBoot------自定义Logback日志
  19. Exception occurred during processing request: id to load is required for loading
  20. Jmeter之目录结构

热门文章

  1. python3+dlib人脸识别及情绪分析
  2. 微信的自动回复&接入聊天机器人
  3. [USACO 07NOV]Cow Relays
  4. [Wc2010]重建计划
  5. codeforces 868A Bark to Unlock
  6. 计蒜客NOIP模拟赛(3)D1T3 任性的国王
  7. 【bzoj4009 hnoi2015】接水果
  8. bzoj3224Tyvj 1728 普通平衡树 treap
  9. Delphi7 ADO面板上的控件简介
  10. 在 Mac OS X 上安装 TensorFlow