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