iOS 응용 (swift)
[iOS - swift] RxCocoa로 TableView delegate 처리 방법
jake-kim
2021. 12. 10. 01:15
RxCocoa에서 제공하는 방법으로 tableView의 ControlEvent 처리 방법
RxCocoa의 UITableView+Rx 파일에 존재

- itemSelected: 선택한 셀의 IndexPath 값 획득

// viewDidLoad()에서 호출
private func setupTableViewDelegate() {
tableView.rx.itemSelected
.map { "셀 선택 indexPath = \($0)" }
.bind(to: titleLabel.rx.text)
.disposed(by: disposeBag)
}
- modelSelected: 선택한 셀의 model 값을 획득

- itemDeleted

tableView.rx.itemDeleted
.map { "아이템 제거 = \($0)" }
.bind(to: titleLabel.rx.text)
.disposed(by: disposeBag)
- itemMoved

- itemMoved - 바인딩
단, moved되기 위해서는 tableView.setEditing()이 필요 (아래에서 계속)
tableView.rx.itemMoved .map { "아이템 이동 \n= \($0)" } .bind(to: titleLabel.rx.text) .disposed(by: disposeBag)
- tableView.setEditing()하기 위해, navigationController에 navigation item을 추가가 필요
-> embed in navigationController
- UIViewController에 내부적으로 존재하는 editButtonItem를 navigationItem.rightBarButtonItem으로 설정
// viewDidLoad()에서 호출 private func addEditButtonToNavigationItem() { navigationItem.rightBarButtonItem = editButtonItem } - setEditing설정을 위한 바인딩
editButtonItem.rx.tap .subscribe(onNext: { [weak self] in self?.toggleEditMode() }).disposed(by: disposeBag) private func toggleEditMode() { let toggleEditMode = !tableView.isEditing tableView.setEditing(toggleEditMode, animated: true) }
- tableView.setEditing()하기 위해, navigationController에 navigation item을 추가가 필요
cf) itemSelected와 modelSelected() 같이 선언하면 나중에 선언된 바인딩만 되므로, zip연사자를 통해 두 값을 모두 얻도록 설계
Observable
.zip(tableView.rx.itemSelected, tableView.rx.modelSelected(MySection.Item.self))
.map { "셀 선택 \($0),\n\($1)" }
.bind(to: titleLabel.rx.text)
.disposed(by: disposeBag)
* 전체 소스 코드: https://github.com/JK0369/ExDynamicHeightCell