从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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)