日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SwiftUI之如何使用@EnvironmentObject在视图之间共享数据

發布時間:2024/5/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SwiftUI之如何使用@EnvironmentObject在视图之间共享数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 對于應該與應用程序中的許多視圖共享的數據,SwiftUI 為我們提供了 @EnvironmentObject 屬性包裝器,這讓我們可以在任何需要的地方共享模型數據,同時還確保我們的視圖在數據更改時自動保持更新。
  • 可以把 @EnvironmentObject 看作在許多視圖上使用,是一種比 @ObservedObject 更智能、更簡單的方式。與其在視圖 A 中創建一些數據,然后將其傳遞給視圖 B,然后是視圖 C,然后是視圖 D 才最終使用它,可以在視圖 A 中創建它并將其放入環境中,以便視圖 B、C 和 D 將自動訪問它。
  • 就像 @ObservedObject 一樣,永遠不會為 @EnvironmentObject 屬性賦值。相反,它應該從其他地方傳入,最終您可能想要使用 @StateObject 在某處創建它。但是,與 @ObservedObject 不同的是,我們不會手動將對象傳遞到其它視圖中。相反,使用將數據發送到一個名為 environmentObject() 的修飾符,這使得該對象在 SwiftUI 的環境中可用于該視圖以及其中的任何其它對象(需要注意:環境對象必須由父視圖提供,如果 SwiftUI 找不到正確類型的環境對象,程序就會崩潰,這也適用于預覽,所以要小心)、
  • 為了演示環境對象,我們將定義三件事:
    • 一個 GameSettings 類,其中包含一個名為 score 的已發布屬性;
    • 期望在環境中接收 GameSettings 對象并顯示其 score 屬性的 ScoreView 視圖;
    • 一個創建 GameSettings 對象的 ContentView 視圖,有一個按鈕可以將 1 添加到它的 score 屬性,還有一個 NavigationLink 來顯示詳細信息視圖。
  • 如下所示:
// Our observable object class class GameSettings: ObservableObject {@Published var score = 0 }// A view that expects to find a GameSettings object // in the environment, and shows its score. struct ScoreView: View {@EnvironmentObject var settings: GameSettingsvar body: some View {Text("Score: \(settings.score)")} }// A view that creates the GameSettings object, // and places it into the environment for the // navigation view. struct ContentView: View {@StateObject var settings = GameSettings()var body: some View {NavigationView {VStack {// A button that writes to the environment settingsButton("Increase Score") {settings.score += 1}NavigationLink(destination: ScoreView()) {Text("Show Detail View")}}.frame(height: 200)}.environmentObject(settings)} }
  • 分析該代碼中幾個重要部分:
    • 就像 @StateObject 和 @ObservedObject 一樣,所有與 @EnvironmentObject 一起使用的類都必須符合ObservableObject 協議;
    • 將 GameSettings 放入導航視圖的環境中,這意味著導航視圖中的所有視圖都可以根據需要讀取該對象,以及導航視圖顯示的任何視圖;
    • 當使用 @EnvironmentObject 屬性包裝器時,聲明希望接收的事物類型,但并沒有創建它,畢竟我們希望從環境中接收它;
    • 因為我們的細節視圖顯示在導航視圖中,所以它可以訪問相同的環境,這意味著它可以讀取我們創建的 GameSettings 對象;
    • 不需要將環境中的 GameSettings 實例與 ScoreView 中的 settings 屬性顯式關聯,SwiftUI 會自動確定它在環境中具有一個 GameSettings 實例,因此它就是它使用的實例。
  • 既然我們的視圖依賴于存在的環境對象,那么更新預覽代碼以提供一些要使用的示例設置也很重要。 例如,使用 ScoreView().environmentObject(GameSettings()) 之類的東西進行預覽應該這樣做。
  • 如果需要向環境添加多個對象,應該添加多個 environmentObject() 修飾符,只需一個接一個地調用它們。
與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的SwiftUI之如何使用@EnvironmentObject在视图之间共享数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。