Swift开发中如何在UIView中直接实现页面跳转(即如何在子视图中获取其父视图控制器的方法)

/ Mac / 没有评论 / 1590浏览

Swift开发中如何在UIView中直接实现页面跳转(即如何在子视图中获取其父视图控制器的方法)

在Swift的开发中,实现页面之间的跳转我们都是通过在UIViewController来实现其push方法或者present方法来跳转页面的(即控制器之间的跳转切换),但是往往在开发中我们经常会使用MVC的架构来将页面进行模块化的封装,那么问题来了,我们在将页面模块化成一个一个的UIView的模块时候,往往会在UIView或tableViewCell中的一些例如imageView,label等等之类控件上添加点击事件,然后通过触发点击事件来跳转页面,对于这些我们往往常用的做法是使用闭包或者代理方法在其父视图控制器中再去做页面的跳转,这种方法可行,但是感觉每次都这样做很麻烦,那么能不能直接在UIView中获取到其父视图控制器来实现跳转呢,答案肯定是可以的,废话不多说直接上代码:

func nextResponsder(currentView:UIView)->UIViewController{
  var vc:UIResponder = currentView
  while vc.isKind(of: UIViewController.self) != true {
    vc = vc.next!
  }
  return vc as! UIViewController
}

使用上面的代码就可以返回一个当前控件所在的父视图,下面阐述一下原理:

我们都知道对每个view来说都会有一个superView和一个subView,view可以通过他们来获取其父视图和子视图,与此原理一样,那么对于每一个ViewController来说同理也有一个父视图控制器和一个子视图控制器,那么重点来了,我们知道UIView和UIViewController都是UIResponder的子类,那么我们就可以通过nextResponder的方法来获取当前视图的父类型,这种类型会是一种控制链式的结构,那么当获取的视图没有父视图的时候,那么我们就可以拿到这个视图所在的父视图控制器了。