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