参考URL: RxSwiftのUITableViewとのバインディングまとめ
- Observable
import UIKit
import RxSwift
import RxCocoa
final class ViewController: UIViewController {
let itemObservable: Observable<[String]> = Observable.from(optional: ["A", "B", "C", "D", "E"])
private let disposeBag = DisposeBag()
@IBOutlet weak private var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
bindViews()
}
private func bindViews() {
itemObservable
.bind(to: tableView.rx.items(cellIdentifier: "CustomCell", cellType: CustomCell.self)) { row, element, cell in
cell.configure(text: element)
cell.bind()
cell.tapSignal
.emit(onNext: { _ in
print("cell.button.tap!!\(element)")
})
.disposed(by: cell.disposeBag)
}
.disposed(by: disposeBag)
/* Cell Tap */
tableView.rx.itemSelected
.withLatestFrom(itemObservable) { indexPath, items in
return (items[indexPath.row], indexPath)
}
.subscribe(onNext: { (item, indexPath) in
print("indexPath = \(indexPath), item = \(item)")
})
.disposed(by: disposeBag)
}
}
class CustomCell: UITableViewCell {
@IBOutlet weak private var titleLabel: UILabel!
@IBOutlet weak fileprivate var button: UIButton!
fileprivate var titleText: String = ""
var disposeBag = DisposeBag()
var tapSignal: Signal<Void> {
return button.rx.tap.asSignal()
}
func configure(text: String) {
titleText = text
self.titleLabel.text = text
}
func bind() {
button.rx.tap
.asSignal()
.emit(onNext: { _ in
print("Tap!!\(self.titleLabel.text!)")
})
.disposed(by: disposeBag)
}
override func prepareForReuse() {
super.prepareForReuse()
self.disposeBag = DisposeBag()
}
}
- Driver①
import UIKit
import RxSwift
import RxCocoa
final class ViewController: UIViewController {
let itemDriver: Driver<[String]> = Driver.just(["A", "B", "C", "D", "E"])
private let disposeBag = DisposeBag()
@IBOutlet weak private var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
bindViews()
}
private func bindViews() {
itemDriver
.asDriver()
.drive(tableView.rx.items (cellIdentifier: "CustomCell")) { row, element, cell in
if let cell = cell as? CustomCell {
cell.configure(text: element)
cell.bind()
cell.tapSignal
.emit(onNext: { _ in
print("cell.button.tap!!\(element)")
})
.disposed(by: cell.disposeBag)
}
}
.disposed(by: disposeBag)
/* Cell Tap */
tableView.rx.itemSelected
.withLatestFrom(itemDriver) { indexPath, items in
return (items[indexPath.row], indexPath)
}
.subscribe(onNext: { (item, indexPath) in
print("indexPath = \(indexPath), item = \(item)")
})
.disposed(by: disposeBag)
}
}
class CustomCell: UITableViewCell {
@IBOutlet weak private var titleLabel: UILabel!
@IBOutlet weak fileprivate var button: UIButton!
fileprivate var titleText: String = ""
var disposeBag = DisposeBag()
var tapSignal: Signal<Void> {
return button.rx.tap.asSignal()
}
func configure(text: String) {
titleText = text
self.titleLabel.text = text
}
func bind() {
button.rx.tap
.asSignal()
.emit(onNext: { _ in
print("Tap!!\(self.titleLabel.text!)")
})
.disposed(by: disposeBag)
}
override func prepareForReuse() {
super.prepareForReuse()
self.disposeBag = DisposeBag()
}
}
- Driver②
import UIKit
import RxSwift
import RxCocoa
final class ViewController: UIViewController {
let itemDriver: Driver<[String]> = Driver.just(["A", "B", "C", "D", "E"])
private let disposeBag = DisposeBag()
@IBOutlet weak private var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
bindViews()
}
private func bindViews() {
itemDriver
.asDriver()
.drive(tableView.rx.items(cellIdentifier: "CustomCell", cellType: CustomCell.self)) { row, element, cell in
cell.configure(text: element)
cell.bind()
cell.tapSignal
.emit(onNext: { _ in
print("cell.button.tap!!\(element)")
})
.disposed(by: cell.disposeBag)
}
.disposed(by: disposeBag)
/* Cell Tap */
tableView.rx.itemSelected
.withLatestFrom(itemDriver) { indexPath, items in
return (items[indexPath.row], indexPath)
}
.subscribe(onNext: { (item, indexPath) in
print("indexPath = \(indexPath), item = \(item)")
})
.disposed(by: disposeBag)
}
}
class CustomCell: UITableViewCell {
@IBOutlet weak private var titleLabel: UILabel!
@IBOutlet weak fileprivate var button: UIButton!
fileprivate var titleText: String = ""
var disposeBag = DisposeBag()
var tapSignal: Signal<Void> {
return button.rx.tap.asSignal()
}
func configure(text: String) {
titleText = text
self.titleLabel.text = text
}
func bind() {
button.rx.tap
.asSignal()
.emit(onNext: { _ in
print("Tap!!\(self.titleLabel.text!)")
})
.disposed(by: disposeBag)
}
override func prepareForReuse() {
super.prepareForReuse()
self.disposeBag = DisposeBag()
}
}
- Driver③
import UIKit
import RxSwift
import RxCocoa
final class ViewController: UIViewController {
let itemDriver: Driver<[String]> = Driver.just(["A", "B", "C", "D", "E"])
private let disposeBag = DisposeBag()
@IBOutlet weak private var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
bindViews()
}
private func bindViews() {
itemDriver
.asDriver()
.drive(tableView.rx.items) { tableView, row, element in
if let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell") as? CustomCell {
cell.configure(text: element)
cell.bind()
cell.tapSignal
.emit(onNext: { _ in
print("cell.button.tap!!\(element)")
})
.disposed(by: cell.disposeBag)
return cell
}
return UITableViewCell()
}
.disposed(by: disposeBag)
/* Cell Tap */
tableView.rx.itemSelected
.withLatestFrom(itemDriver) { indexPath, items in
return (items[indexPath.row], indexPath)
}
.subscribe(onNext: { (item, indexPath) in
print("indexPath = \(indexPath), item = \(item)")
})
.disposed(by: disposeBag)
}
}
class CustomCell: UITableViewCell {
@IBOutlet weak private var titleLabel: UILabel!
@IBOutlet weak fileprivate var button: UIButton!
fileprivate var titleText: String = ""
var disposeBag = DisposeBag()
var tapSignal: Signal<Void> {
return button.rx.tap.asSignal()
}
func configure(text: String) {
titleText = text
self.titleLabel.text = text
}
func bind() {
button.rx.tap
.asSignal()
.emit(onNext: { _ in
print("Tap!!\(self.titleLabel.text!)")
})
.disposed(by: disposeBag)
}
override func prepareForReuse() {
super.prepareForReuse()
self.disposeBag = DisposeBag()
}
}