티스토리 뷰

소복소복에서 MVVM과 RxSwift를 녹여보겠다는 다짐을 하고 공부를 하고 있는데요!
제가 설계한 뷰의 구조와 Rx를 사용한 CollectionView 만드는 법에 대해 포스팅 하려고 합니다.
(아직 공부하고 있는 단계라 많이 부족하니 .. )

우선 위와 같이 뷰를 잘게잘게 나눴습니다.
뷰를 나누면서 고민한 것은 버튼의 모듈화, 재사용 뷰 이 2가지 입니다.

NavgatiionBar같은 경우 다른 뷰에서 계속 사용이 됩니다.
따라서 NavigationView라는 클래스를 새로 만들어 뒤로가기 버튼, 약 전송하기, 취소 컴포넌트를 넣어 재사용할 수 있게끔 만들었습니다.

버튼 같은 경우는 SobokButton이라는 새로운 CustomButton을 만들어 enum에 따라 사용할 수 있게끔 하였습니당. (추후 포스팅 예정)

enum ButtonMode: Int, CaseIterable {
    case lightMint
    case mainMint
    case inactive
    case active
}

final class SobokButton: UIButton {
.
.


그 다음으로는 컬렉션뷰에 대한 이야기입니다.
보통 컬렉션뷰를 만들 때 delegate, datasource를 만들어서 사용을 하였는데 RxSwift를 사용하니 엄청 간단하게 사용할 수 있게 되었습니다.

import UIKit

import RxSwift
import RxCocoa

final class AddPillFirstViewController: BaseViewController {
    
    private let disposeBag = DisposeBag()
    let addPillFirstView = AddPillFirstView()
    let viewModel = PillTimeViewModel()
    
    override func loadView() {
        self.view = addPillFirstView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        bind()
    }
    
    override func style() {
        view.backgroundColor = .white
        tabBarController?.tabBar.isHidden = true
        navigationController?.isNavigationBarHidden = true
    }
    
    private func bind() {
        viewModel.pillTimeList.bind(to:
            addPillFirstView.collectionView.rx.items(cellIdentifier: "PillTimeCollectionViewCell", cellType: PillTimeCollectionViewCell.self))
        { index, text, cell in
            cell.timeLabel.text = text
        }
        .disposed(by: disposeBag)
        
        addPillFirstView.collectionView.rx.modelSelected(String.self)
            .subscribe(onNext: { text in
                print(text)
            })
            .disposed(by: disposeBag)
    }
}


ViewController의 역할을 줄이기 위해 UI는 addPillFirstView에서 구현을 했고 사진에서와 같이 컬렉션뷰에 보이는 시간 (오전 8:00) 같은 경우는 ViewModel 구조체를 만들어 사용했습니다.

import RxCocoa
import RxSwift

struct PillTimeViewModel {
    let pillTimeList = Observable.of(["오전 8:00", "오후 1:00", "오후 7:00"])
}

bind를 통해 CollectionView를 생성하고 배열의 값을 Cell의 라벨에 보여주었습니다.

(bind -> 데이터를 UI에 표시)
modelSelect 같은 경우 기존 didSelectItem과 같습니다.

Rx로 직접 구현하는 것이 익숙치 않아서 이만 말을 줄이겠습니다 ..
더 자세한 내용은 다음 글에서 포스팅하겠슴당 . . . .. . .!!!!!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함