资讯专栏INFORMATION COLUMN

iOS中如何根据UIView获取所在的UIViewController

darkbug / 2743人阅读

摘要:简述本文将讲述在开发中如何根据某个前提是该已经被加入到中来获取所属的。大概的传递规则就是从视图顶层的向下到再到再到最后到。结束直接把上面这段代码加入你的文件中,就可以调用来获取他的了。

简述

本文将讲述在iOS开发中如何根据某个UIView(前提是该UIView已经被加入到Controller中)来获取所属的UIViewController。


UIResponder

做过事件响应处理的童鞋应该都或多或少听过这个类吧,UIResponder的子类有很多比如UIView、UIViewController、UIWindow甚至是UIApplication。

再引入一个概念叫Responder Chain,即响应用户触摸的一条事件处理、响应的链,用户一旦接触屏幕,这个事件就会按照这条Responder Chain传递下去。大概的传递规则就是从视图顶层的UIView向下到UIViewController再到RootViewController再到Window最后到Application。具体如何传递我这里不再详述,可以参阅UIResponder


实现

当我们知道UIResponder是UIView和UIViewController的父类,而且他们会通过UIResponder形成一条链,那么我们不就可以从UIView开始顺着这条链找到UIViewController了。

啥也不说了直接看代码

extension UIView{
   /**
    Get the controller that this view belongs to. it will return nil if there is no controller. 
    It won"t return a object of the class in arguments, just return a object of UIViewController. 
    If you want use your class, you should use "... as? YourViewControllerClass"  to convert it to the class you need.
    */
   func viewController(aClass: AnyClass) -> UIViewController?{
       for(var next=self.superview;(next != nil);next=next?.superview){
           let nextResponder = next?.nextResponder()
           if((nextResponder?.isKindOfClass(aClass)) != nil){
               return nextResponder as? UIViewController
           }
       }
       return nil
   }
}

extension这里是Swift的提供的用于扩展某个类的写法,这里我扩展了UIView,为他加上了一个viewController方法。用一个循环先找到最底层的UIView,然后通过这个最底层的UIView顺着Responder chain去找该UIView的下一个nextResponder()。由于Responder是UIViewController的父类,我们通过as转换成UIViewController即可。


结束

直接把上面这段代码加入你的Swift文件中,UIView就可以调用viewController()来获取他的controller了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16181.html

相关文章

  • 【YFMemoryLeakDetector】人人都能理解 iOS 内存泄露检测工具类

    摘要:背景即使到今天,应用的内存泄露检测,仍然是一个很重要的主题。视图和控制器相关的内存泄露,几乎都不存在了。时过境迁,今天在网上搜了下内存泄露检测,各种讨论技术文章,有点头大。对象创建,对于视图,拦截的是对于控制器拦截的是。 背景 即使到今天,iOS 应用的内存泄露检测,仍然是一个很重要的主题。我在一年前,项目中随手写过一个简单的工具类,当时的确解决了大问题。视图和控制器相关的内存泄露,几...

    gghyoo 评论0 收藏0
  • iOS转场研究(3)

    摘要:使用时需要注意的情况当我们使用的方法以的方式来跳转场景的时候,情况与在有很大不同。因此实现风格的的时候,动画的不能搞错,必须对中的顶层操作。而以正确的方式重写这些方法并不容易。下面的代码修改自中的示例代码。 实现自定义的Container View Controller 上一篇文章中提到了如何定制Segue。我们知道Unwind Segue的正常工作需要Container View ...

    RyanHoo 评论0 收藏0
  • IOS开发学习-程序启动原理

    摘要:一要点掌握和文件的作用的常见使用的代理方法的关系程序的完整启动过程二与文件常见的设置建立一个工程后,会在文件夹下看到一个工程名的文件,该文件对工程做一些运行期的配置,非常重要,不能删除。 一、要点掌握 Info.plist和pch文件的作用 UIApplication的常见使用 AppDelegate的代理方法 UIApplication、AppDelegate、UIWindow...

    jay_tian 评论0 收藏0
  • iOS开发②应用界面

    摘要:界面应用界面主要是使用框架开发,它有一套自己的模式,其中视图和控制器是中的及其子类和及其子类。应用界面构建层次一般情况下,用于中只包含一个。 iOS界面应用界面主要是使用Cocoa Touch框架开发,它有一套自己的MVC模式,其中视图和控制器是UIKit中的UIVIew及其子类和UIVIewController及其子类。 视图控制器 Cocoa Touch中UIVIewControl...

    liangzai_cool 评论0 收藏0
  • iOS开发遇到那些坑,持续更新

    摘要:开发中遇到的那些坑持续更新按钮布局,上下排版在使用中,用一个图文上下排版形式的按钮,机会还是蛮多的。删除多余的分割线在开发中,有时候会遇到数据源的数量并不能铺满整个屏幕,在下方留下一大段的分割线空白。 iOS开发中遇到的那些坑,持续更新 按钮布局,上下排版 在使用中,用一个图文上下排版形式的按钮,机会还是蛮多的。这种情况,大多数都是直接修改 按钮的 imageEdgeInsets 和 ...

    Yuqi 评论0 收藏0

发表评论

0条评论

darkbug

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<