RxCocoa에서는 델리게이트 패턴을 사용하지 않고, 옵저버블을 테이블에 바인딩한다.

import UIKit
import RxSwift
import RxCocoa
class RxCocoaTableViewViewController: UIViewController {
@IBOutlet weak var listTableView: UITableView!
let priceFormatter: NumberFormatter = {
let f = NumberFormatter()
f.numberStyle = NumberFormatter.Style.currency
f.locale = Locale(identifier: "Ko_kr")
return f
}()
let bag = DisposeBag()
let nameObservable = Observable.of(appleProducts.map { $0.name })
let productObservable = Observable.of(appleProducts)
override func viewDidLoad() {
super.viewDidLoad()
// #1
nameObservable.bind(to: listTableView.rx.items) { tableView, row, element //테이블뷰참조, row인덱스, 표시할 요소
in
let cell = tableView.dequeueReusableCell(withIdentifier: "standardCell")!
cell.textLabel?.text = element
return cell
}
.disposed(by: bag)
}
}
//# 2
nameObservable.bind(to: listTableView.rx.items(cellIdentifier: "standardCell")) { row, element, cell in
cell.textLabel?.text = element
}
.disposed(by: bag)
productObservable.bind(to: listTableView.rx.items(cellIdentifier: "productCell", cellType: ProductTableViewCell.self)) { [weak self] row, element, cell in
cell.categoryLabel.text = element.category
cell.productNameLabel.text = element.name
cell.summaryLabel.text = element.summary
cell.priceLabel.text = self?.priceFormatter.string(for: element.price)
}
.disposed(by: bag)

listTableView.rx.itemSelected
.subscribe(onNext: { [weak self] indexPath in
self?.listTableView.deselectRow(at: indexPath, animated: true)
})
.disposed(by: bag)

listTableView.rx.modelSelected(Product.self)
.subscribe(onNext: { product in
print(product.name)
})
.disposed(by: bag)
Observable.zip(listTableView.rx.modelSelected(Product.self), listTableView.rx.itemSelected)
.bind { [weak self] (product, indexPath) in
self?.listTableView.deselectRow(at: indexPath, animated: true)
print(product.name)
}
.disposed(by: bag)
modelSelected 활용itemIndex를 활용listTableView.rx.setDelegate(self)
.disposed(by: bag)
//이후 기존 cocoatouch 식으로 구현