今天在做一个demo,就是我通过点击UITableViewCell中的一个按钮,然后跳转到另一个界面,原作者的做法是直接在ViewController中完成这个Action,我认为这是不妥的,首先是分装性不够,其次是无法处理单一的事件(或许每个cell对这个的button的需求不同),因此我对事件进行了封装,给UITableViewCell写了一个扩展来获取当前的UIViewController,代码如下:
extension UITableViewCell {
func getCurrentViewController()-> UIViewController? {
let window = UIApplication.sharedApplication().keyWindow
let navigationController = window?.rootViewController
if navigationController is UINavigationController {
let navigation = navigationController as! UINavigationController
return navigation.topViewController!
}
return nil
}
}
这段代码的缺陷就是我这里只判断了UINavigationController,其他的类型请各位根据自己的情况来添加。
然后通过这个来执行下面的代码:
extension VideoCell {
func presentViewController() {
let currentController = getCurrentViewController()
currentController?.presentViewController(self.playViewController, animated: true, completion: {
self.playViewController.player?.play()
})
}
}
至于为什么我选择在UITableViewCell中进行界面的跳转,是参考了sunnyxx的SelfManager思想,使Cell的封装性更强,扩展中加功能是为了不破坏原来的代码。