반응형
private func setupActions() {
agreeBtn.rx.tap
.bind(to: agreeButtonTapped)
.disposed(by: disposeBag)
goBtn.rx.tap
.bind(to: goButtonTapped)
.disposed(by: disposeBag)
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
[agreeBtn, termTitleLabel, goBtn].forEach {
self.contentView.addSubview($0)
}
self.backgroundColor = .clear
self.selectionStyle = .none
setupActions()
}
init부분에 Rx바인딩 함수를 넣고 아무리 해도 되질 않았는데....ㅠ
그 이유는..
해결방법 및 이유
이유는 바로 셀의 재사용과 구독 관리때문이였습니다..
UITableView에서 셀은 성능 최적화를 위해 재사용됩니다.
셀을 재사용할 때 이전 상태나 구독이 남아있다면, 예상치 못한 동작이 발생할 수 있습니다.
따라서 prepareForReuse에서 disposeBag을 초기화하여 이전 구독을 해제하고, 새로운 구독을 설정하는 것이 중요합니다.
해결방법
override func prepareForReuse() {
super.prepareForReuse()
self.disposeBag = DisposeBag()
setupActions()
}
왜 setupActions을 prepareForReuse에서 호출해야 하는가?
setupActions을 prepareForReuse에서 호출하지 않으면, 재사용된 셀에서 버튼 클릭 이벤트가 제대로 처리되지 않을 수 있습니다. 이는 이전 구독이 해제되지 않고 남아있거나, 새로운 구독이 설정되지 않기 때문입니다.
- 구독의 해제:
- disposeBag을 초기화하면 이전 구독이 모두 해제됩니다. 이는 셀이 재사용될 때마다 새로운 상태로 시작
- 구독의 재설정:
- setupActions를 통해 버튼의 새로운 구독을 설정합니다. 이 과정을 통해 셀이 재사용될 때마다 버튼 클릭 이벤트에 대한 구독 설정
결론
반응하지 않았던 이유는, 셀이 재사용되면서 구독이 되지않았고, disposeBag 또한 엉켜버린것이다. 후후후
그래서 재사용 시 상태 초기화와 구독의 해제 및 초기화를 하면 해결이된다!
반응형
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] PrimitiveSequenceType (0) | 2024.09.30 |
---|---|
[RxSwift] Merge와 concat (0) | 2024.09.19 |
[RxSwift] Rx를 이용한 페이징처리 (0) | 2024.06.25 |
[RxSwift] Map, FlatMap (Combining Operators ) (0) | 2024.06.17 |
[RxSwift] Rx를 이용한 백그라운드 감지 (0) | 2024.06.14 |