Notice
Recent Posts
Recent Comments
Link
ยซ   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
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[ReactorKit] ReactorKit ๊ณต๋ถ€ํ•˜๊ธฐ #7 View (programming) ๋ณธ๋ฌธ

apple/๐Ÿฆ• UIKit & ReactiveX

[ReactorKit] ReactorKit ๊ณต๋ถ€ํ•˜๊ธฐ #7 View (programming)

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2022. 10. 1. 11:42

ReactorKit ๊ณต๋ถ€ํ•˜๊ธฐ #7 View (programming)

 

 

ReactorKit์˜ ๋งŽ์€ ์˜ˆ์ œ๋“ค์ด ์Šคํ† ๋ฆฌ๋ณด๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๊ธฐ์— ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•ด ๋ด„.

 

์š”์•ฝ

1. ์ž์ฃผํ•˜๋Š” ์‹ค์ˆ˜ - ReactorKit ์‚ฌ์šฉํ•  ๋•Œ

: ๋ฆฌ์•กํ„ฐ reference๋ฅผ ์•„๋ฌด๋ฐ๋„ ์•ˆ์žก์•„์ค˜์„œ deinit ๋˜์–ด์„œ ๊ฒฐ๊ตญ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‹ค์ˆ˜

 

2. ์ž์ฃผํ•˜๋Š” ์‹ค์ˆ˜ - bind ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š”๋ฐ ๋ช…์‹œ์ ์œผ๋กœ ๋˜ ํ˜ธ์ถœํ•˜๋Š”๊ฑฐ

: init์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Œ.

 

์šฐ์„  ReactorKit์— ์„ ์–ธ๋œ ํ”„๋กœํ† ์ฝœ View๋ฅผ ์—ด์–ด๋ณด์ž.

ReactorKit ํ”„๋กœํ† ์ฝœ View

 

 

extension ๋ถ€๋ถ„์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, bind๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ์Œ.

 

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

 

 

bind๋ฅผ ViewDidLoad()์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

 

โœ… ViewController โœ…

import UIKit
import ReactorKit
import RxSwift
import RxCocoa

class MyMemoViewController: UIViewController, View {
    var disposeBag = DisposeBag()
    typealias Reactor = MyMemoReactor
    
    override func viewDidLoad() {
        super.viewDidLoad()
     
        setUI()
    }
    
    func bind(reactor: Reactor) {
        // MARK: - Action
        
        cancelButton.rx.tap
            .map { Reactor.Action.didTapDismiss }
            .bind(to: reactor.action)
            .disposed(by: disposeBag)
        
        // MARK: - State
        reactor.state.map { $0.isDismissed }
            .filter { $0 }
            .withUnretained(self)
            .bind { owner, _ in
                owner.dismiss(animated: true)
            }
            .disposed(by: disposeBag)
    }
    
    // MARK: - Initialize
    init(reactor: MyMemoReactor = Reactor(initialState: .init())) {
        super.init(nibName: nil, bundle: nil)
        self.reactor = reactor
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // MARK: - UIComponents
    var memoTextField = UITextView()
    var comfirmButton = UIBarButtonItem(title: "โœ…", style: .plain, target: nil, action: nil)
    var cancelButton = UIBarButtonItem(image: UIImage(systemName: "xmark"), style: .plain, target: nil, action: nil)
    
}

extension MyMemoViewController {
    private func setUI() {
        self.navigationItem.leftBarButtonItem = cancelButton
        self.navigationItem.rightBarButtonItem = comfirmButton
        cancelButton.tintColor = .yellow
        comfirmButton.tintColor = .yellow
        
        self.navigationController?.navigationBar.backgroundColor = .systemBlue
        
        view.backgroundColor = .systemBlue
        view.addSubview(memoTextField)
        
        memoTextField.font = UIFont.systemFont(ofSize: 22.0)
        memoTextField.layer.cornerRadius = 12
        
        memoTextField.snp.makeConstraints {
            $0.edges.equalTo(view.safeAreaLayoutGuide).inset(10)
        }
    }
}

 

 

โœ… Reactor โœ…

import RxSwift
import RxCocoa
import ReactorKit
import UIKit

class MyMemoReactor: Reactor {
    enum Action {
        case didTapDismiss
    }
    
    enum Mutation {
        case dismiss(Bool)
    }
    
    struct State {
        var isDismissed: Bool = false
    }
    
    let initialState: State
    
    init(initialState: State) {
        self.initialState = initialState
    }
    
    func mutate(action: Action) -> Observable<Mutation> {
        print("mutate")
        switch action {
        case .didTapDismiss:
            return .just(.dismiss(true))
        }
    }
    
    func reduce(state: State, mutation: Mutation) -> State {
        var newState = state
        print("reduce")
        switch mutation {
        case .dismiss(let value):
            print("called dissmiss \(value)")
            newState.isDismissed = value
        }
        return newState
    }
}

 

Comments