RxSwift使用UITableVIew,给自定义的UITableVIewCell绑定动作

在使用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里的按钮点击事件)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值