Почему свойство @State в SwiftUI не читается снаружи?

Я только хочу не читать, а не менять значение свойства @State моего представления SwiftUI. В .onAppear значение будет изменено, но это изменение не будет видно внешнему миру. Почему?

      class MyController : UIHostingController<SwiftUIView> {
    public func getText() -> String? {
        rootView.text
    }
}

struct SwiftUIView: View {
    @State public var text: String?
    
    var body: some View {
        Text(text ?? "Hello World")
            .background(Color.red)
            .onAppear {
                text = "so und so"
            }
    }
}

class ViewController: UIViewController {
    var subs = Set<AnyCancellable>()
    var vc: MyController!
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        vc = MyController(rootView: SwiftUIView())
        vc.view.backgroundColor = UIColor.green
        
        addChild(vc)
        view.addSubview(vc.view)
        vc.view.frame = view.bounds
        
        print("text = \(vc.getText() ?? "nil")")
        
        Timer.publish(every: 1, on: .current, in: .default)
            .autoconnect()
            .receive(on: RunLoop.main)
            .sink { _ in
                print("text = \(self.vc.getText() ?? "nil")")
            }
            .store(in: &subs)
    }
}

Я знаю, что @State и @ObservedObject существуют. @State предназначен для внутреннего управляемого состояния, @ObservedObject — для внешнего управляемого состояния. Но я не хочу менять значение, я только не хочу читать. Но почему это невозможно и почему возвращаемое значение равно нулю? Это просто неправильно. Это не проблема времени.

1 ответ

Объявите значение вViewControllerи передать его вSwiftUIView.

Другие вопросы по тегам