- 실제 활용되고 있는 프로젝트 코드를 RxSwift형식으로 바꿔보면서 활용해보자.
- 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)
- 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)
- 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)