ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift selectedSegmentIndex 연동 안되는 문제
    🧑‍💻/Swift 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)
    
        ...
    }

     

    정상 화면


    참고

    반응형

    댓글

Designed by Tistory.