View.md
January 14, 2023 ยท View on GitHub
Create view
- Create empty
MainViewController.swiftfile insideexmpl/Mainfolder inexmplproject - Add imports
import UIKit
import Highway
- Add Store as a property and initializer
// ...
final class MainViewController: UIViewController {
private let store: Store<MainFeature.State, MainFeature.Action>
init(store: Store<MainFeature.State, MainFeature.Action>) {
self.store = store
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
- Add increment/decrement buttons
// ...
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
let incrementButton = UIButton(primaryAction: UIAction(handler: { [weak self] _ in
self?.store.dispatch(.increment)
}))
incrementButton.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(incrementButton)
incrementButton.leftAnchor.constraint(equalTo: view.centerXAnchor, constant: 20).isActive = true
incrementButton.topAnchor.constraint(equalTo: view.centerYAnchor, constant: 20).isActive = true
incrementButton.setTitle("+", for: .normal)
incrementButton.titleLabel?.font = .systemFont(ofSize: 30)
let decrementButton = UIButton(primaryAction: UIAction(handler: { [weak self] _ in
self?.store.dispatch(.decrement)
}))
decrementButton.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(decrementButton)
decrementButton.rightAnchor.constraint(equalTo: view.centerXAnchor, constant: -20).isActive = true
decrementButton.topAnchor.constraint(equalTo: view.centerYAnchor, constant: 20).isActive = true
decrementButton.setTitle("-", for: .normal)
decrementButton.titleLabel?.font = .systemFont(ofSize: 30)
}
// ...
- Add label property
final class MainViewController: UIViewController {
// ...
private var label: UILabel!
- Add label
override func viewDidLoad() {
// ...
let label = UILabel()
label.text = "\(store.state.count)"
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
self.label = label
}
- Subscribe to store updates
override func viewDidLoad() {
// ...
store.subscribe { [weak self] state in
DispatchQueue.main.async { [weak self] in
self?.label.text = "\(state.count)"
}
}
}