如何从外部更新SwiftUI视图状态(例如UIViewController)

Nun*_*ves 3 ios swift swiftui

我有一个SwiftUI视图:

struct CatView : View {

    @State var eyesOpened: Bool = false

    var body: some View {
       Image(uiImage: eyesOpened ? #imageLiteral(resourceName: "OpenedEyesCat") : #imageLiteral(resourceName: "ClosedEyesCat"))
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其与常规UIViewController集成。

let hostingVC = UIHostingController<CatView>(rootView: cat)
addChild(hostingVC)
view.addSubview(hostingVC.view)
hostingVC.view.pinToBounds(of: view)
Run Code Online (Sandbox Code Playgroud)

现在在UIViewController中,如果我尝试设置eyesOpened属性,则会得到一个

Thread 1: Fatal error: Accessing State<Bool> outside View.body

我们应该如何做这项工作?SwiftUI视图是否不应该在这种情况下工作?

Rob*_*egg 6

@State是在这里使用错误的东西。您需要使用@ObservedObject

@State:用于您的SwiftUI视图本地发生更改时使用-例如,您可以从自身的SwiftUI视图中更改从toggle或按钮等所打开的eyeOpens。

@ObservedObject:将您的SwiftUI视图绑定到外部数据源-即传入通知或数据库中的更改,这是您的SwiftUI视图外部的内容。

我强烈建议您观看以下WWDC视频-SwiftUI的数据流