在使用UITableVIew的时候,一般都会自定义一个UITableVIewCell,但是对于UITableVIewCell上的动作点击,点击Cell上具体的按钮,图片时通过Rxswift绑定具体的动作。
- 自定义Cell
import Foundation
import RxSwift
import RxCocoa
class TestCell: UITableViewCell {
private(set) var disposeBag = DisposeBag()
private let iconImage = UIImageView()
let mainText = UILabel()
// MARK: Init and deinit
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setUpUI()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setUpUI()
}
// Cell重用,disposeBag要重新声明
override func prepareForReuse() {
super.prepareForReuse()
disposeBag = DisposeBag()
}
private func setUpUI() {
selectionStyle = .none
self.contentView.backgroundColor = UIColor.init(red: 38/255.0, green: 39/255.0, blue: 43/255.0, alpha: 1.0)
iconImage.image = UIImage(named: "xxx")
self.contentView.addSubview(iconImage)
iconImage.snp.makeConstraints { (make) in
make.centerY.equalToSuperview()
make.height.width.equalTo(4.px)
make.leading.equalToSuperview().offset(17.pxl)
}
mainText.text = ""
mainText.font = UIFont.systemFont(ofSize: 14)
mainText.textColor = UIColor.white.withAlphaComponent(0.7)
mainText.lineBreakMode = .byTruncatingTail
mainText.numberOfLines = 2
self.contentView.addSubview(mainText)
mainText.snp.makeConstraints { (make) in
make.centerY.equalToSuperview()
make.leading.equalTo(iconImage.snp.trailing).offset(8.pxl)
make.trailing.equalToSuperview().offset(-17.pxl)
}
}
override func layoutSubviews() {
super.layoutSubviews()
}
//
func fillWith(_ item: Config) {
mainText.text = item.itemName
let paraph = NSMutableParagraphStyle()
//将行间距设置为3
paraph.lineSpacing = 3
//样式属性集合
let attributes = [NSAttributedString.Key.underlineStyle: 1, NSAttributedString.Key.paragraphStyle: paraph] as [NSAttributedString.Key: Any]
mainText.attributedText = NSAttributedString(string: item.itemName, attributes: attributes)
mainText.isUserInteractionEnabled = true
}
}
- 使用UITableView
comTableView.backgroundColor = UIColor.init(red: 38/255.0, green: 39/255.0, blue: 43/255.0, alpha: 1.0)
comTableView.register(TestCell.self, forCellReuseIdentifier: "cell")
comTableView.rowHeight = comPorCellHeight
comTableView.separatorStyle = .none
comTableView.isScrollEnabled = false
comTableView.allowsSelection = false
进行数据绑定
Observable<[config]>.of([config,])
.bind(to: comTableView.rx.items) {[weak self] (tableView, _, item) in
guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? TestCell else {
return UITableViewCell()
}
cell.fillWith(item)
let tap = UITapGestureRecognizer()
tap.rx.event.subscribe(onNext: {[weak self] _ in
self?.doCellTap(config: item)
}).disposed(by: cell.disposeBag)
cell.mainText.addGestureRecognizer(tap)
return cell
}.disposed(by: disposeBag)
提一个我在做的时候遇到的坑,在自定义Cell中,我将图片和文字都加入了继承的tableviewcell的根view中,导致绑定的动作不起作用,后来查资料发现,原来是在继承的tableviewcell中还有一个contentview,而contentView使用了lazy初始化,导致后初始化的contentView直接覆盖在我自己添加的图片,文字组件上方,所以解决办法(1.直接将自定义的组件加入contenView, 2.提前调用一下contentView使其初始化提前。)
贴上我解决问题的文章链接(iOS14 自定义cell上按钮点击事件没有响应)
其他参考链接
给TabelViewCell绑定动作的几种方法
RxSwift的使用详解62(订阅UITableViewCell里的按钮点击事件)