Swift如何取得View所属的ViewController
从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的显示与隐藏
swift 如何控制view的显示与隐藏 UIView有一个属性 hidden let line: UILabel = UILabel() 默认是显示的 需要显示它的时候:line.hidden = ...
- 用Swift完成不同View Controller之间的切换
之前用objective-c开发时,页面之间的切换很容易.其实用swift没有很大的变化,如果你是用storyboard完成的界面,基本上是同样的方式,只不过在代码部分写成swift风格的就行了. 今 ...
- Swift语言之View,Button控件实现小方块在界面上的移动(纯代码实现)
import UIKit class ViewController: UIViewController { var diamonds:UIView! var diamondsXY = CGRectMa ...
- 【iOS解决思路】得到某个view所在的ViewController
在一个tableViewCell中有个btn,如何得到它所在的viewcontroller,以便于push出新的viewController? 我的思路是传值,但网上有下面这种方法,分享. 跟得到某个 ...
- [Swift] Add Scroll View
import UIKit class AboutViewController : UIViewController @IBOutlet weak var scrollView: UIScrollVie ...
- iOS - 通过view查找所在(viewController)
- (UIViewController *)findViewController:(UIView *)sourceView { id target=sourceView; while (target) ...
- iOS viewController 和 view 的创建消失生命周期总结
控制器创建的生命周期 1. 如果从stroryBoard 中产生一个controller,那么会先调用initWithCoder:, awakeFromNib, loadView,viewDidLoa ...
- View和viewController的生命周期
View和viewController的生命周期 一.ViewController的职责 对内管理与之关联的View,对外跟其他ViewController通信和协调.对于与之关联的View,View ...
- iOS view和viewController的生命周期
一.ViewController的职责 对内管理与之关联的View,对外跟其他ViewController通信和协调.对于与之关联的View,ViewController总是在需要的时候才加载视图,并 ...
随机推荐
- 机器学习技法:16 Finale
Roadmap Feature Exploitation Techniques Error Optimization Techniques Overfitting Elimination Techni ...
- Event 发布与订阅(一)
前言 主要讲的是发布与订阅在Event中的一个简单实现用来加深理解. C #中的事件(Event)的理解: 事件具有以下属性:(From Events) 发行者确定何时引发事件:订户确定对事件作出何种 ...
- [USACO 13NOV]No Change
Description Farmer John is at the market to purchase supplies for his farm. He has in his pocket K c ...
- ●Joyoi Normal
题链: http://www.joyoi.cn/problem/tyvj-1953题解: 定义d(u,v)这个函数,满足: d(u,v)=1,当且仅当在点分树中,u是v的祖先 d(u,v)=0,其它情 ...
- Codeforces Round #419 D. Karen and Test
Karen has just arrived at school, and she has a math test today! The test is about basic addition an ...
- [BZOJ]1005 明明的烦恼(HNOI2008)
BZOJ的第一页果然还是很多裸题啊,小C陆续划水屯些板子. Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间 ...
- bzoj2096[Poi2010]Pilots 单调队列
2096: [Poi2010]Pilots Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 983 Solved: 513[Submit][Statu ...
- JSP 基本语法
1 JSP 的由来 servlet产生后,存在很大的问题,为了表现页面的效果,需要输出大量的HTML 语句,表现为一个个字符串,不仅利于开发,也不利于后期的维护,由此产生了JSP.主要用于将Servl ...
- Requests库介绍
Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...
- 欢迎大家来到DevLegal的博客
申明:以下博文欢迎转载,转载请注明出处和作者 若非作者原创,则会标记出处与原作者,其余则为原创. 本人在校大学僧一枚,软件工程专业,希望通过将自己的学习心得与体会写出来,勉励自己学习,同时与大家一起分 ...