使用响应链方法实现传值及事件传递

假设现在有一个需求, 如果一个自定义cell中有一个button, button的点击事件要将自定义cell中的某个属性值传给控制器, 应该怎么做?

当然你可以利用代理, 通知, 和block回调, 除此之外, 还有没有其他办法呢? 有! 那就是今天要说的路由响应链方法,避免了重复代码及代码美观性

代码总共分为三个部分
1、UIResponder类别

@objc
extension UIResponder {
    func router(name: String, modelInfo: NSDictionary) {
        if let next = self.next {
            //当自己没有相应这个方法的时候,去查找下一个相应者
            next.router(name: name, modelInfo: modelInfo)
        }
    }
}

2、UITableViewCell

class TestCell: UITableViewCell {
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        let button = UIButton(type: .custom)
        button.frame = CGRect(x: 100, y: 0, width: 100, height: 100)
        button.backgroundColor = UIColor.red
        button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside)
        self.contentView.addSubview(button)
    }
    
    @objc private func buttonTapped(sender: UIButton) {
        sender.router(name: "TestButton", modelInfo: ["name": "hello world"])
    }
}

3、UIViewController(关键代码)

override func router(name: String, modelInfo: NSDictionary) {
     //实现这个方法即可
     //打印可知,传递过来的参数是cell传递的参数
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,167评论 1 32
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,758评论 8 265
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,028评论 3 119
  • 01 公司有一大叔,是一部门老大。平时做事总是担心别人不知道,特别是害怕老板看不到,哪怕放个P都要在公司工作群里发...
    入兴贵贤阅读 501评论 0 1
  • 在城市车水马龙 人潮拥挤中遇见你 我脑子迷糊得像乡野的泥潭 你跟所有人都是不一样的 或许用一些词语才能形容你 王子...
    江小昨阅读 306评论 1 4