View.md

January 14, 2023 ยท View on GitHub

Create view

  1. Create empty MainViewController.swift file inside exmpl/Main folder in exmpl project
  2. Add imports
import UIKit
import Highway
  1. 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")
    }
}
  1. 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)
}

// ...
  1. Add label property
final class MainViewController: UIViewController {
    // ...

    private var label: UILabel!
  1. 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
}
  1. Subscribe to store updates
override func viewDidLoad() {
    // ...

    store.subscribe { [weak self] state in
        DispatchQueue.main.async { [weak self] in
            self?.label.text = "\(state.count)"
        }
    }
}

Next: Module builder