🧑‍💻/Swift

RxSwift selectedSegmentIndex 연동 안되는 문제

유리맥 2021. 7. 22. 13:51
반응형

 

UISegmentedControl의 selectedSegmentIndex 값을 직접 변경 시 valueChanged 이벤트를 전송해야 합니다.

segctrlTime.selectedSegmentIndex = 0

segctrlTime.sendActions(for: .valueChanged)

 

⬇️ 자세히 보기 ⬇️

 

UISegmentedControl의 selectedSegmentIndex 값에 따라 다른 화면을 표시해주기 위해 아래와 같이 RxCocoa를 사용해서 비동기 처리를 했습니다.

/* 두번째 화면의 ViewController */
override func viewDidLoad() {
    super.viewDidLoad()

    ...

    segctrlTime.rx.selectedSegmentIndex
        .observe(on: MainScheduler.instance)
        .map { return ($0 == self.scheduled ? false : true) }
        .subscribe(onNext: {
            self.viewTaskDetails.subviews[0].isHidden = $0
            self.viewTaskDetails.subviews[1].isHidden = $0
        })
        .disposed(by: disposeBag)

    ...
}
    
override func viewWillAppear(_ animated: Bool) {
    
    ...

    // Scheduled / Anytime
    if let date = task.date, !date.isEmpty {
        segctrlTime.selectedSegmentIndex = scheduled
    } else {
        segctrlTime.selectedSegmentIndex = anytime
    }

    ...
}

 

Schduled 작업은 날짜/시간을 선택할 수 있고, Anytime 작업은 시간 값이 필요없습니다.
Anytime Cell 선택 시 selectedSegmentIndex에 anytime(value: 1) 값을 지정해줬습니다.
그런데 날짜/시간 View가 여전히 표시됩니다.

오류 화면

 

UISegmentedControl에게 값이 변경되었다는 Action을 전송하여 문제를 해결할 수 있었습니다.

override func viewWillAppear(_ animated: Bool) {
    ...

    // Scheduled / Anytime
    if let date = task.date, !date.isEmpty {
        segctrlTime.selectedSegmentIndex = scheduled
    } else {
        segctrlTime.selectedSegmentIndex = anytime
    }
    // 값 변경됨 Action 전송
    segctrlTime.sendActions(for: .valueChanged)

    ...
}

 

정상 화면


참고

반응형