Avatar
withObservationTracking 使ったコード貼り忘れてました。 import SwiftUI import UIKit struct FooView: UIViewControllerRepresentable { func makeUIViewController(context: Context) -> some UIViewController { FooViewController() } func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { } } final class FooViewController: UIViewController { private let state: FooViewState = .init() private let label: UILabel = .init() override func viewDidLoad() { super.viewDidLoad() label.translatesAutoresizingMaskIntoConstraints = false view.addSubview(label) let countUpButton: UIButton = .init(type: .system) countUpButton.translatesAutoresizingMaskIntoConstraints = false countUpButton.setTitle("Count up", for: .normal) countUpButton.addAction(.init { [state] _ in state.countUp() }, for: .touchUpInside) view.addSubview(countUpButton) let resetButton: UIButton = .init(type: .system) resetButton.translatesAutoresizingMaskIntoConstraints = false resetButton.setTitle("Reset", for: .normal) resetButton.addAction(.init { [state] _ in state.reset() }, for: .touchUpInside) view.addSubview(resetButton) NSLayoutConstraint.activate([ label.centerXAnchor.constraint(equalTo: view.centerXAnchor), countUpButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), resetButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), countUpButton.centerYAnchor.constraint(equalTo: view.centerYAnchor), countUpButton.topAnchor.constraint(equalTo: label.bottomAnchor, constant: 8), resetButton.topAnchor.constraint(equalTo: countUpButton.bottomAnchor, constant: 8), ]) updateViews() } private func updateViews() { withObservationTracking { label.text = state.count.description } onChange: { [weak self] in guard let self else { return } Task { @MainActor in self.updateViews() } } } } @MainActor @Observable final class FooViewState { var count: Int = 0 func countUp() { count += 1 } func reset() { count = 0 } }
❤️ 2