Mac Plus

Hello Swift

RxSwift 활용하기2

  • 실제 활용되고 있는 프로젝트 코드를 RxSwift형식으로 바꿔보면서 활용해보자.
  1. collectionView로 되어있는 뷰를 변경해보기
    • 일단은 collectionView에 걸려있는 delegate, dataSource를 해제 시켜주고 ViewController에 걸려있는 UICollectionViewDelete, UICollectionviewDataSource를 지워준다.

위에서 지워줬기 때문에 해당 코드들도 삭제시켜주고 rx형태로 collectionView를 만들어준다.

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    
    }
  let menu = Observable.just (
    menus.map { $0 }
  )
  
  menu.bind(to: collectionView.rx.items(cellIdentifier: "cell", cellType: "커스텀 해당 셀 이름".self)) { (row, element, cell) in
     // cellForItemAt에 있던 셀에대한 코드를 넣어준다.
  }.disposed(by: disposeBag)
        
  collectionView.rx
    .modelSelected(String.self) // type을 넣어준다. 만약 
    .subscribe(onNext: { element in
        // didSelectItemAt에 있던 셀을 클릭했을때의 코드를 넣어준다.        
      }).disposed(by: disposeBag)
  1. validation체크하기
    • textField가 2개있는데 한개는 30자이상이 되면 안되고 다른 textField는 수정이 불가능하다.
TextField1.rx.text.orEmpty.asObservable().map { $0.count >= 31 }
  .subscribe(onNext: {
      if $0 {
          self.TextField1.text = String(self.TextField1.text?.prefix(30) ?? "") //30자가 넘어가면 다시 30자로 세팅해준다.
          self.errorAlert("title", "30자까지만 입력 가능합니다.") //customErrorAlert창
      }
  }).disposed(by: disposeBag)
  
TextField2.rx.controlEvent([.editingDidBegin]).asObservable() //editingDidBegin event를 구독해서 접근이 가능하지 않도록 해준다.
  .subscribe(onNext: {
      self.errorAlert("link", "링크는 수정이 불가능합니다.") //customErrorAlert창
      DispatchQueue.main.asyncAfter(deadline: .now()) {
          self.TextField1.becomeFirstResponder() // 커서를 다시 TextField1으로 변경해준다.
      }
  }).disposed(by: disposeBag)
  1. keyboard show/hide
    • NotificationCenter를 이용해서 키보드가 올라오거나 내려가는 addObserver를 설정해주고 keyboard의 높이를 구해서 계산해 줬는데 rx로 변경
func keyboardHeight() -> Observable<CGFloat> {
    return Observable
      .from([
          NotificationCenter.default.rx.notification(NSNotification.Name.UIKeyboardWillShow)
            .map { notification -> CGFloat in
              (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.height ?? 0
            },
          NotificationCenter.default.rx.notification(NSNotification.Name.UIKeyboardWillHide)
            .map { _ -> CGFloat in
               0
            }
      ]).merge()
}

//키보드 체크
keyboardHeight()
  .observeOn(MainScheduler.instance)
  .subscribe(onNext: { keyboardHeight in
      UIView.animate(withDuration: 0.5, animations: {
          if keyboardHeight > 0 {
              self.testView.transform = CGAffineTransform(translationX: 0, y: -(keyboardHeight / 2)) //이런식으로 view를 움직여주면 된다.
          } else {
              self.testView.transform = CGAffineTransform.identity
          }
      })
  }).disposed(by: disposeBag)