簡體   English   中英

如何從外部更新 SwiftUI 視圖狀態(例如 UIViewController)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM