Swift如何取得View所属的ViewController

Swift如何取得View所属的ViewController,第1张

概述从VC取得View很容易,但有些情况下我们需要从View反向获取VC. 不过在一些特殊的场合,Cocoa库帮我们想的很周到,比如在自定义View过渡动画的时候: func animateTransition(transitionContext: UIViewControllerContextTransitioning) { } 系统在回调我们的animateTransition方法时,会传入一个c

从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)!
总结

以上是内存溢出为你收集整理的Swift如何取得View所属的ViewController全部内容,希望文章能够帮你解决Swift如何取得View所属的ViewController所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1075230.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存