Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- SWIFT
- clean architecture
- UICollectionView
- ios
- uiscrollview
- MVVM
- Protocol
- swiftUI
- HIG
- RxCocoa
- 스위프트
- Human interface guide
- 클린 코드
- Clean Code
- combine
- UITextView
- rxswift
- 리팩토링
- swift documentation
- Observable
- collectionview
- tableView
- uitableview
- ribs
- map
- 리펙터링
- Xcode
- Refactoring
- 애니메이션
- 리펙토링
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] RxCocoa로 TableView delegate 처리 방법 본문
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
'iOS 응용 (swift)' 카테고리의 다른 글
Comments