引言: 使用swift的小伙伴肯定被如何实现一个可选协议方法而困扰过, 这里为大家提供一个自定义UITableViewCell的实例, 相信能够帮到你.
ZZTableViewCell中的实现
import UIKit
//以前必须写为@objc protocol ZZTableViewCellDelegate : NSObjectProtocol的形式, 现在直接这么写就行了
@objc protocol ZZTableViewCellDelegate {
//必选协议方法
func ZZTableViewCellRequiredFunction()
//可选协议方法
@objc optional
func ZZTableViewCellOptionalFunction()
}
class ZZTableViewCell: UITableViewCell {
var delegate : ZZTableViewCellDelegate?
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
selectionStyle = UITableViewCell.SelectionStyle.none
let button = UIButton.init()
contentView.addSubview(button)
button.frame = contentView.bounds
button.addTarget(self, action:#selector(buttonClick(button:)) , for: UIControl.Event.touchUpInside)
}
@objc func buttonClick(button: UIButton) {
//调用必选协议方法
delegate?.ZZTableViewCellRequiredFunction()
//调用可选协议方法
delegate?.ZZTableViewCellOptionalFunction?()
// 以前的形式(打开会报错, 因为delegate没有继承与NSObjectProtocol)
// if delegate?.responds(to: #selector(ZZTableViewCellDelegate.ZZTableViewCellOptionalFunction)) {
// delegate?.ZZTableViewCellOptionalFunction?()
// }
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
控制器中的使用
//MARKl- tableView
extension ZZHomeVC: UITableViewDelegate, UITableViewDataSource, ZZTableViewCellDelegate {
func createTableView() {
tableView = UITableView.init(frame: self.view.bounds, style: UITableView.Style.plain)
view.addSubview(tableView)
tableView.delegate = self
tableView.dataSource = self;
tableView.register(ZZTableViewCell.classForCoder(), forCellReuseIdentifier: "ZZTableViewCell")
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ZZTableViewCell", for: indexPath) as! ZZTableViewCell
cell.textLabel?.text = "这里是第: " + String(indexPath.row) + "行, 点击试试看"
cell.delegate = self
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10;
}
//注意, 这里只实现了必选的协议方法哦
func ZZTableViewCellRequiredFunction() {
print("必选的协议方法被调用了")
}
// //注意, 这里是可选协议方法, 不实现也不会报错
// func ZZTableViewCellOptionalFunction() {
// print("可选的协议方法被调用了")
// }
}
关于我们:
有用的话, 记得留下你的小星星, 让更多人知道哦.
欢迎吐槽, qq邮箱: 1156858877@qq.com
网友评论