我們知道通過訂閱 tableView
的 itemSelected
或 modelSelected
這兩個 Rx
擴展方法,可以對單元格的點擊事件進行響應(yīng)诀艰,并執(zhí)行相關(guān)的業(yè)務(wù)代碼雳锋。
但有時我們并不需要整個 cell
都能進行點擊響應(yīng)黄绩,可能是點擊單元格內(nèi)的按鈕時才觸發(fā)相關(guān)的操作,下面通過樣例演示這個功能的實現(xiàn)玷过。
1爽丹,效果圖
(1)點擊單元格右側(cè)的按鈕后,會彈出顯示該單元格的內(nèi)容以及索引值辛蚊。
(2)而點擊單元格其他位置粤蝎,不觸發(fā)任何操作。
2袋马,樣例代碼
(1)MyTableCell.swift
(自定義單元格類)
注意 prepareForReuse()
方法里的 disposeBag = DisposeBag()
每次 prepareForReuse()
方法執(zhí)行時都會初始化一個新的 disposeBag
初澎。這是因為 cell
是可以復(fù)用的,這樣當(dāng) cell
每次重用的時候飞蛹,便會自動釋放之前的 disposeBag
谤狡,從而保證 cell
被重用的時候不會被多次訂閱灸眼,避免錯誤發(fā)生。
import UIKit
import RxSwift
//單元格類
class MyTableCell: UITableViewCell {
var button:UIButton!
var disposeBag = DisposeBag()
//單元格重用時調(diào)用
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) //普通狀態(tài)下的文字
button.backgroundColor = UIColor.orange
button.layer.cornerRadius = 5
button.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")
}
}
(2)ViewController.swift
(主視圖控制器)
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
var tableView:UITableView!
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
//創(chuàng)建表格視圖
self.tableView = UITableView(frame: self.view.frame, style:.plain)
//創(chuàng)建一個重用的單元格
self.tableView!.register(MyTableCell.self, forCellReuseIdentifier: "Cell")
//單元格無法選中
self.tableView.allowsSelection = false
self.view.addSubview(self.tableView!)
//初始化數(shù)據(jù)
let items = Observable.just([
"文本輸入框的用法",
"開關(guān)按鈕的用法",
"進度條的用法",
"文本標(biāo)簽的用法",
])
//設(shè)置單元格數(shù)據(jù)(其實就是對 cellForRowAt 的封裝)
items
.bind(to: tableView.rx.items) { (tableView, row, element) in
//初始化cell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
as! MyTableCell
cell.textLabel?.text = "\(element)"
//cell中按鈕點擊事件訂閱
cell.button.rx.tap.asDriver()
.drive(onNext: { [weak self] in
self?.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)
}
}