Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] RxCocoa로 TableView delegate 처리 방법 본문

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)
      }​

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

Comments