์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
Tags
- tableView
- rxcocoa
- node.js
- visionOS
- MVVM
- Lv2
- reactorkit
- combine
- Swfit
- CollectionView
- raywenderlich
- SwiftUI
- RxSwift
- SnapKit
- Flutter
- Xcode
- swift
- ios
- UIKit
- designpattern
- ๋ฐฑ์ค
- ํจ์คํธ์บ ํผ์ค
- arkit
- XCTest
- Kuring
- TCA
- BFS
- realm
- BOJ
- ํ๋ก๊ทธ๋๋จธ์ค
Archives
- Today
- Total
lgvv98
[ReactorKit] ReactorKit ๊ณต๋ถํ๊ธฐ #7 View (programming) ๋ณธ๋ฌธ
apple/๐ฆ UIKit & ReactiveX
[ReactorKit] ReactorKit ๊ณต๋ถํ๊ธฐ #7 View (programming)
๐ฅ ์บ๋ฟ๋งจ 2022. 10. 1. 11:42ReactorKit ๊ณต๋ถํ๊ธฐ #7 View (programming)
ReactorKit์ ๋ง์ ์์ ๋ค์ด ์คํ ๋ฆฌ๋ณด๋ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์ด ์๊ธฐ์ ์ฝ๋ ๊ธฐ๋ฐ์ ์์ ๋ฅผ ์์ฑํด ๋ด.
์์ฝ
1. ์์ฃผํ๋ ์ค์ - ReactorKit ์ฌ์ฉํ ๋
: ๋ฆฌ์กํฐ reference๋ฅผ ์๋ฌด๋ฐ๋ ์์ก์์ค์ deinit ๋์ด์ ๊ฒฐ๊ตญ ์๋ํ์ง ์๋ ์ค์
2. ์์ฃผํ๋ ์ค์ - bind ๋ด๋ถ์ ์ผ๋ก ํธ์ถ๋๋๋ฐ ๋ช ์์ ์ผ๋ก ๋ ํธ์ถํ๋๊ฑฐ
: init์ผ๋ก ํ ์ ์์.
์ฐ์ 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
}
}
'apple > ๐ฆ UIKit & ReactiveX' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ReactorKit + RxDataSources #2(RxTableViewSectionedAnimatedDataSource) (0) | 2022.10.05 |
---|---|
ReactorKit + RxDataSources #1(SectionModelType) (0) | 2022.10.05 |
[ReactorKit] ReactorKit ๊ณต๋ถํ๊ธฐ #6 transform (0) | 2022.09.22 |
[ReactorKit] ReactorKit ๊ณต๋ถํ๊ธฐ #5 RxTodo ๋ฐ๋ผ์ก๊ธฐ (3) (0) | 2022.09.12 |
[ReactorKit] ReactorKit ๊ณต๋ถํ๊ธฐ #4 RxTodo ๋ฐ๋ผ์ก๊ธฐ (2) (0) | 2022.09.08 |
Comments