![](/img/trans.png)
[英]UIHostingController embedded in UIViewController - how to update @State from outside?
[英]How to update a SwiftUI view state from outside (UIViewController for example)
我有一個 SwiftUI 視圖:
struct CatView : View {
@State var eyesOpened: Bool = false
var body: some View {
Image(uiImage: eyesOpened ? #imageLiteral(resourceName: "OpenedEyesCat") : #imageLiteral(resourceName: "ClosedEyesCat"))
}
}
我正在嘗試將它與常規 UIViewController 集成。
let hostingVC = UIHostingController<CatView>(rootView: cat)
addChild(hostingVC)
view.addSubview(hostingVC.view)
hostingVC.view.pinToBounds(of: view)
現在在 UIViewController 中,如果我嘗試設置 eyeOpened 屬性,我會得到一個
Thread 1: Fatal error: Accessing State<Bool> outside View.body
我們應該如何進行這項工作? SwiftUI 視圖不應該在這種情況下工作嗎?
@State在這里使用是錯誤的。 您需要使用@ObservedObject 。
@State:用於當您的 SwiftUI 視圖在本地發生更改時 - 即您在 SwiftUI 視圖中通過切換或按鈕等更改 eyeOpened。
@ObservedObject:將 SwiftUI 視圖綁定到外部數據源 - 即傳入通知或數據庫中的更改,SwiftUI 視圖外部的內容。
我強烈建議您觀看以下WWDC 視頻 - 通過 SwiftUI 的數據流
您可以使用稱為通知中心的東西。 簡而言之,這是一種視圖之間可以相互通信的方式,而無需實際修改彼此的任何內容。
它的工作原理是視圖 A 向中央集線器發送通知,視圖 B 從中聽到所述通知。 當視圖 B 聽到它激活的通知時,並調用用戶定義的函數。
更詳細的解釋可以參考: https : //learnappmaking.com/notification-center-how-to-swift/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.