Swift如何取得View所属的ViewController
2016-06-11 09:38
316 查看
从VC取得View很容易,但有些情况下我们需要从View反向获取VC.
不过在一些特殊的场合,Cocoa库帮我们想的很周到,比如在自定义View过渡动画的时候:
系统在回调我们的animateTransition方法时,会传入一个context参数,从它我们可以轻松取得参与动画的toView,fromView以及它们对应的VC:
但不是所有情况系统都会帮你考虑的这么周到,所以有时候还得需要自己从View找到它的VC,网上有Obj-c的代码示例:
我们来将其改为Swift版本,以下是第一次尝试:
上面的方法可以很好的完成其功能,不过编译器有警告,for如此的语法将会在将来的Swift版本中剔除,所以我们还是将其转成没有警告的代码:
正如你所见,虽然没有警告,但是代码要稍微多一些了.
最后我们可以把开始的代码替换如下:
不过在一些特殊的场合,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)!
相关文章推荐
- 获取当前日期时间、日期时间格式化及转换
- [转]---使用 Realm 和 Swift 创建 ToDo 应用
- UBUNTU15.10上安装swift环境
- Swift 项目首次启动轮播页的制作
- [swift学习之十六]RunTime练习一
- swift:定时器的使用、回调函数的指定方式
- Swift 延时执行
- coreData relationShip
- 为什么 NSLog 不支持 Swift 对象(转)
- swift常用词汇(持续更新)
- Swift使用NSJSONSerialization请求解析JOSN文件
- iOS开发 - Swift使用JavaScriptCore与JS交互
- 為 Swift 代碼編寫含有 Mardown 語法的文檔
- swift 图层设置遮罩层
- swift iOS8 XIB 问题
- Swift
- swift中变量的get和set
- swift UIBezierPath基本使用
- 制作Swift Framework
- 【Swift】UISearchBar输入框的背景颜色