Swift - RxSwift的使用詳解62 (訂閱UITableViewCell里的按鈕點擊事件)

我們知道通過訂閱 tableViewitemSelectedmodelSelected 這兩個 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)
    }
}

RxSwift使用詳解系列
原文出自:www.hangge.com轉(zhuǎn)載請保留原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墓懂,一起剝皮案震驚了整個濱河市焰宣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捕仔,老刑警劉巖匕积,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異榜跌,居然都是意外死亡闪唆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門钓葫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悄蕾,“玉大人,你說我怎么就攤上這事础浮》鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵豆同,是天一觀的道長番刊。 經(jīng)常有香客問我,道長影锈,這世上最難降的妖魔是什么芹务? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鸭廷,結(jié)果婚禮上枣抱,老公的妹妹穿的比我還像新娘。我一直安慰自己靴姿,他們只是感情好沃但,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布磁滚。 她就那樣靜靜地躺著佛吓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垂攘。 梳的紋絲不亂的頭發(fā)上维雇,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音晒他,去河邊找鬼吱型。 笑死,一個胖子當(dāng)著我的面吹牛陨仅,可吹牛的內(nèi)容都是我干的津滞。 我是一名探鬼主播铝侵,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼触徐!你這毒婦竟也來了咪鲜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撞鹉,失蹤者是張志新(化名)和其女友劉穎疟丙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸟雏,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡享郊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了孝鹊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炊琉。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖又活,靈堂內(nèi)的尸體忽然破棺而出温自,到底是詐尸還是另有隱情,我是刑警寧澤皇钞,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布悼泌,位于F島的核電站,受9級特大地震影響夹界,放射性物質(zhì)發(fā)生泄漏馆里。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一可柿、第九天 我趴在偏房一處隱蔽的房頂上張望鸠踪。 院中可真熱鬧,春花似錦复斥、人聲如沸营密。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽评汰。三九已至,卻和暖如春痢虹,著一層夾襖步出監(jiān)牢的瞬間被去,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工奖唯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惨缆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像坯墨,于是被迫代替她去往敵國和親寂汇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容