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

2018-08-13  本文已影响0人  _狸约约

假设现在有一个需求, 如果一个自定义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传递的参数
}
上一篇下一篇

猜你喜欢

热点阅读