如何从外部更新SwiftUI视图状态(例如UIViewController) [英] How to update a SwiftUI view state from outside (UIViewController for example)
问题描述
我有一个SwiftUI视图:
I have a SwiftUI view:
struct CatView : View {
@State var eyesOpened: Bool = false
var body: some View {
Image(uiImage: eyesOpened ? #imageLiteral(resourceName: "OpenedEyesCat") : #imageLiteral(resourceName: "ClosedEyesCat"))
}
}
我正在尝试将其与常规UIViewController集成.
I'm trying to integrate it with in a regular UIViewController.
let hostingVC = UIHostingController<CatView>(rootView: cat)
addChild(hostingVC)
view.addSubview(hostingVC.view)
hostingVC.view.pinToBounds(of: view)
现在在UIViewController中,如果我尝试设置eyesOpened属性,我会得到
Now in the UIViewController if I try to set the eyesOpened property I get a
Thread 1: Fatal error: Accessing State<Bool> outside View.body
我们应该如何进行这项工作? SwiftUI视图在这种情况下不应该工作吗?
How are we supposed to make this work? Are SwiftUI views not supposed to work in this scenario?
推荐答案
@State 是错误的用法.您需要使用 @ObservedObject .
@State is the wrong thing to use here. You'll need to use @ObservedObject.
@State:用于在您的SwiftUI视图中本地发生更改时-即,您可以从SwiftUI视图自身中的切换按钮或按钮等中更改eyeOpens.
@State: Used for when changes occur locally to your SwiftUI view - ie you change eyesOpened from a toggle or a button etc from within the SwiftUI view it self.
@ObservedObject::将您的SwiftUI视图绑定到外部数据源-即传入通知或数据库中的更改,例如外部到您的SwiftUI视图.
@ObservedObject: Binds your SwiftUI view to an external data source - ie an incoming notification or a change in your database, something external to your SwiftUI view.
我强烈建议您观看以下 WWDC视频-通过SwiftUI进行数据流
I would highly recommend you watch the following WWDC video - Data Flow Through SwiftUI
这篇关于如何从外部更新SwiftUI视图状态(例如UIViewController)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!