iOS/RxSwift

[RxSwift] 재사용으로 인해, 테이블뷰 셀안에 버튼이 반응하지 않을때

최지철 2024. 7. 10. 17:03
728x90
반응형

    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 또한 엉켜버린것이다. 후후후
그래서 재사용 시 상태 초기화와 구독의 해제 및 초기화를 하면 해결이된다!

 

728x90
반응형