生活随笔
收集整理的這篇文章主要介紹了
RxSwift之订阅UITableViewCell里的按钮点击事件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、前言
- 我們知道,通過訂閱 tableView 的 itemSelected 或 modelSelected 這兩個 Rx 擴展方法,可以對單元格的點擊事件進行響應,并執行相關的業務代碼。
- 但有時候并不需要整個 cell 都能進行點擊響應,可能是點擊單元格內的按鈕時才觸發相關的操作。
二、效果展示
- 點擊單元格右側的按鈕后,會彈出顯示該單元格的內容以及索引值;
- 而點擊單元格其他位置,不觸發任何操作。
三、示例
- MyTableCell.swift(自定義單元格類)
-
- 注意 prepareForReuse() 方法里的 disposeBag = DisposeBag();
-
- 每次 prepareForReuse() 方法執行時都會初始化一個新的 disposeBag,這是因為 cell 是可以復用的,這樣當 cell 每次重用的時候,便會自動釋放之前的 disposeBag,從而保證 cell 被重用的時候不會被多次訂閱,避免錯誤發生。
class MyTableCell: UITableViewCell {var button
:UIButton!var disposeBag
= DisposeBag()override func prepareForReuse() {super.prepareForReuse()disposeBag
= DisposeBag()}override init(style
: UITableViewCellStyle, reuseIdentifier
: String?) {super.init(style
: style
, reuseIdentifier
: reuseIdentifier
)button
= UIButton(frame
:CGRect(x
:0, y
:0, width
:40, height
:25))button
.setTitle("點擊", for:.normal
) button
.backgroundColor
= UIColor.orangebutton
.layer
.cornerRadius
= 5button
.titleLabel
?.font
= UIFont.systemFont(ofSize
: 13)self.addSubview(button
)}override func layoutSubviews() {super.layoutSubviews()button
.center
= CGPoint(x
: bounds
.size
.width
- 35, y
: bounds
.midY
)}required init?(coder aDecoder
: NSCoder) {fatalError("init(coder:) has not been implemented")}
}
- ViewController.swift(主視圖控制器):
var tableView
:UITableView!
let disposeBag
= DisposeBag()
self.tableView
= UITableView(frame
: self.view
.frame
, style
:.plain
)
self.tableView
!.register(MyTableCell.self, forCellReuseIdentifier
: "Cell")
self.tableView
.allowsSelection
= false
self.view
.addSubview(self.tableView
!)
let items
= Observable.just(["文本輸入框的用法","開關按鈕的用法","進度條的用法","文本標簽的用法",])
items
.bind(to
: tableView
.rx
.items
) { (tableView
, row
, element
) inlet cell
= tableView
.dequeueReusableCell(withIdentifier
: "Cell")as! MyTableCellcell
.textLabel
?.text
= "\(element)"cell
.button
.rx
.tap
.asDriver().drive(onNext
: { [weak self] inself?.showAlert(title
: "\(row)", message
: element
)}).disposed(by
: cell
.disposeBag
)return cell
}.disposed(by
: disposeBag
)
func showAlert(title
: String, message
: String) {let alert
= UIAlertController(title
: title
, message
: message
,preferredStyle
: .alert
)alert
.addAction(UIAlertAction(title
: "確定", style
: .cancel
))self.present(alert
, animated
: true)
}
總結
以上是生活随笔為你收集整理的RxSwift之订阅UITableViewCell里的按钮点击事件的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。