Files
swift-composable-architectu…/Examples/CaseStudies/UIKitCaseStudies/CounterViewController.swift
aladdin a792049575 Hide UIViewController method/properties in UIKit Example code (#3238)
* refactor: hide decrementButtonTapped function

* refactor: hide incrementButtonTapped function

* refactor: hide CounterViewController's store

* refactor: hide CountersTableViewController's store

* refactor: hide EagerNavigationViewController's store

* refactor: hide LazyNavigationViewController's store

* refactor: hide IfLetStoreController's stored properties
2024-07-14 12:00:38 -04:00

94 lines
2.3 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import ComposableArchitecture
import UIKit
@Reducer
struct Counter {
@ObservableState
struct State: Equatable, Identifiable {
let id = UUID()
var count = 0
}
enum Action {
case decrementButtonTapped
case incrementButtonTapped
}
var body: some Reducer<State, Action> {
Reduce { state, action in
switch action {
case .decrementButtonTapped:
state.count -= 1
return .none
case .incrementButtonTapped:
state.count += 1
return .none
}
}
}
}
final class CounterViewController: UIViewController {
private let store: StoreOf<Counter>
init(store: StoreOf<Counter>) {
self.store = store
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
let decrementButton = UIButton(type: .system)
decrementButton.addTarget(self, action: #selector(decrementButtonTapped), for: .touchUpInside)
decrementButton.setTitle("", for: .normal)
let countLabel = UILabel()
countLabel.font = .monospacedDigitSystemFont(ofSize: 17, weight: .regular)
let incrementButton = UIButton(type: .system)
incrementButton.addTarget(self, action: #selector(incrementButtonTapped), for: .touchUpInside)
incrementButton.setTitle("+", for: .normal)
let rootStackView = UIStackView(arrangedSubviews: [
decrementButton,
countLabel,
incrementButton,
])
rootStackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(rootStackView)
NSLayoutConstraint.activate([
rootStackView.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
rootStackView.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor),
])
observe { [weak self] in
guard let self else { return }
countLabel.text = "\(store.count)"
}
}
@objc private func decrementButtonTapped() {
store.send(.decrementButtonTapped)
}
@objc private func incrementButtonTapped() {
store.send(.incrementButtonTapped)
}
}
#Preview {
CounterViewController(
store: Store(initialState: Counter.State()) {
Counter()
}
)
}