三费就、UIButton 與 UIBarButtonItem
1诉瓦,按鈕點(diǎn)擊響應(yīng)
(1)假設(shè)我們想實(shí)現(xiàn)點(diǎn)擊按鈕后,彈出一個(gè)消息提示框。
(2)點(diǎn)擊響應(yīng)我們可以這么寫:
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
//按鈕點(diǎn)擊響應(yīng)
button.rx.tap
.subscribe(onNext: { [weak self] in
self?.showMessage("按鈕被點(diǎn)擊")
})
.disposed(by: disposeBag)
}
//顯示消息提示框
func showMessage(_ text: String) {
let alertController = UIAlertController(title: text, message: nil, preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "確定", style: .cancel, handler: nil)
alertController.addAction(cancelAction)
self.present(alertController, animated: true, completion: nil)
}
}
(3)或者這么寫也行:
//按鈕點(diǎn)擊響應(yīng)
button.rx.tap
.bind { [weak self] in
self?.showMessage("按鈕被點(diǎn)擊")
}
.disposed(by: disposeBag)
2睬澡,按鈕標(biāo)題(title)的綁定
(1)下面樣例當(dāng)程序啟動(dòng)時(shí)就開始計(jì)數(shù)固额,同時(shí)將拼接后的最新文本作為 button
的標(biāo)題。
(2)代碼如下猴贰,其中 rx.title
為 setTitle(_:for:)
的封裝对雪。
//創(chuàng)建一個(gè)計(jì)時(shí)器(每1秒發(fā)送一個(gè)索引數(shù))
let timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
//根據(jù)索引數(shù)拼接最新的標(biāo)題,并綁定到button上
timer.map{"計(jì)數(shù)\($0)"}
.bind(to: button.rx.title(for: .normal))
.disposed(by: disposeBag)
3米绕,按鈕富文本標(biāo)題(attributedTitle)的綁定
(1)下面樣例當(dāng)程序啟動(dòng)時(shí)就開始計(jì)時(shí)瑟捣,同時(shí)將已過去的時(shí)間格式化,并設(shè)置好文字樣式后顯示在 button
標(biāo)簽上栅干。
(2)代碼如下迈套,其中 rx.attributedTitle
為 setAttributedTitle(_:controlState:)
的封裝。
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
//創(chuàng)建一個(gè)計(jì)時(shí)器(每1秒發(fā)送一個(gè)索引數(shù))
let timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
//將已過去的時(shí)間格式化成想要的字符串碱鳞,并綁定到button上
timer.map(formatTimeInterval)
.bind(to: button.rx.attributedTitle())
.disposed(by: disposeBag)
}
//將數(shù)字轉(zhuǎn)成對(duì)應(yīng)的富文本
func formatTimeInterval(ms: NSInteger) -> NSMutableAttributedString {
let string = String(format: "%0.2d:%0.2d.%0.1d",
arguments: [(ms / 600) % 600, (ms % 600 ) / 10, ms % 10])
//富文本設(shè)置
let attributeString = NSMutableAttributedString(string: string)
//從文本0開始6個(gè)字符字體HelveticaNeue-Bold,16號(hào)
attributeString.addAttribute(NSAttributedStringKey.font,
value: UIFont(name: "HelveticaNeue-Bold", size: 16)!,
range: NSMakeRange(0, 5))
//設(shè)置字體顏色
attributeString.addAttribute(NSAttributedStringKey.foregroundColor,
value: UIColor.white, range: NSMakeRange(0, 5))
//設(shè)置文字背景顏色
attributeString.addAttribute(NSAttributedStringKey.backgroundColor,
value: UIColor.orange, range: NSMakeRange(0, 5))
return attributeString
}
}
4桑李,按鈕圖標(biāo)(image)的綁定
(1)下面樣例當(dāng)程序啟動(dòng)時(shí)就開始計(jì)數(shù),根據(jù)奇偶數(shù)選擇相應(yīng)的圖片作為 button
的圖標(biāo)窿给。
(2)代碼如下贵白,其中 rx.image
為 setImage(_:for:)
的封裝。
//創(chuàng)建一個(gè)計(jì)時(shí)器(每1秒發(fā)送一個(gè)索引數(shù))
let timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
//根據(jù)索引數(shù)選擇對(duì)應(yīng)的按鈕圖標(biāo)崩泡,并綁定到button上
timer.map({
let name = $0%2 == 0 ? "back" : "forward"
return UIImage(named: name)!
})
.bind(to: button.rx.image())
.disposed(by: disposeBag)
5禁荒,按鈕背景圖片(backgroundImage)的綁定
(1)下面樣例當(dāng)程序啟動(dòng)時(shí)就開始計(jì)數(shù),根據(jù)奇偶數(shù)選擇相應(yīng)的圖片作為 button
的背景角撞。
(2)代碼如下呛伴,其中 rx.backgroundImage
為 setBackgroundImage(_:for:)
的封裝。
//創(chuàng)建一個(gè)計(jì)時(shí)器(每1秒發(fā)送一個(gè)索引數(shù))
let timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
//根據(jù)索引數(shù)選擇對(duì)應(yīng)的按鈕背景圖谒所,并綁定到button上
timer.map{ UIImage(named: "\($0%2)")! }
.bind(to: button.rx.backgroundImage())
.disposed(by: disposeBag)
6热康,按鈕是否可用(isEnabled)的綁定
(1)下面樣例當(dāng)我們切換開關(guān)(UISwitch
)時(shí),button
會(huì)在可用和不可用的狀態(tài)間切換劣领。
(2)代碼如下:
switch1.rx.isOn
.bind(to: button1.rx.isEnabled)
.disposed(by: disposeBag)
7姐军,按鈕是否選中(isSelected)的綁定
(1)下面樣例中三個(gè)按鈕只有一個(gè)按鈕處于選中狀態(tài)。即點(diǎn)擊選中任意一個(gè)按鈕尖淘,另外兩個(gè)按鈕則變?yōu)槲催x中狀態(tài)庶弃。
(2)代碼如下:
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!
override func viewDidLoad() {
//默認(rèn)選中第一個(gè)按鈕
button1.isSelected = true
//強(qiáng)制解包,避免后面還需要處理可選類型
let buttons = [button1, button2, button3].map { $0! }
//創(chuàng)建一個(gè)可觀察序列德澈,它可以發(fā)送最后一次點(diǎn)擊的按鈕(也就是我們需要選中的按鈕)
let selectedButton = Observable.from(
buttons.map { button in button.rx.tap.map { button } }
).merge()
//對(duì)于每一個(gè)按鈕都對(duì)selectedButton進(jìn)行訂閱歇攻,根據(jù)它是否是當(dāng)前選中的按鈕綁定isSelected屬性
for button in buttons {
selectedButton.map { $0 == button }
.bind(to: button.rx.isSelected)
.disposed(by: disposeBag)
}
}
}