簡體   English   中英

SwiftUI:在打開視圖時條件/ ObservableObject 更改時更新視圖

[英]SwiftUI: Update views when conditions / ObservableObject changed while view is opened

我想這很可能是一個愚蠢的問題,但目前我正在努力。 為了避免大量代碼,我簡化了代碼(見下文),但它應該顯示問題。

我有多個不屬於父母關系的觀點。 在一個視圖 (ViewA) 上,我設置了一個目標日期。 在另一個視圖 (ViewB) 上,我根據目標日期是否在未來顯示文本。 對於這兩個視圖,我都使用 ObservableObject。 我希望 ViewB 在打開時更改文本並且達到目標日期。 由於我使用標簽@Published,我期待它直接工作。 但不幸的是,什么也沒有發生。

這是我最初的方法。

我測試了更多解決方案,例如

  1. 使用 function 在視圖中通過計時器輪詢以獲取當前日期
  2. 我還考慮過首先計算剩余時間和 ObservedObject 中另一個線程中的計時器,該線程在計時器達到 0 時觸發事件並在視圖中使用 onReceive 修飾符。

但我想我的方法非常糟糕,我會有更好的解決方案。

非常感謝您的幫助。

謝謝,塞巴斯蒂安


搜索數據:

class SearchData: ObservableObject {

   @Published var targetDate: Date = UserDefaults.standard.object(forKey: "targetDate") as? Date ?? Date() {
       didSet {
           UserDefaults.standard.set(self.targetDate, forKey: "targetDate")
       }
   }
}


觀點一:

struct ViewA: View {
   @ObservedObject var searchData = SearchData()

   func setDate() {
       searchData.targetDate = Date() + 120
   }

   var body: some View {

       Button(action: {
           self.setDate()
       }) {
           Text("Set Date")
       }
   }
}


視圖 B:

struct ViewB: View {
   @ObservedObject var searchData = SearchData()

   var body: some View {
       VStack() {
           if searchData.targetDate > Date() {
               Text("Text A")
           } else {
               Text("Text B")
           }
           Spacer()
           Text("\(searchData.targetDate)")
       }
       .padding()
   }
}

ViewAViewB使用不同的SearchData實例。 如您所寫,要直接發布作品,兩個視圖都必須使用一個可觀察的 object 實例。

struct ViewA: View {
   @ObservedObject var searchData: SearchData
   /// ... other code

struct ViewB: View {
   @ObservedObject var searchData: SearchData
   /// ... other code

在你裝箱的地方

let searchData = SearchData()
...

ViewA(searchData: searchData)

...

ViewB(searchData: searchData)

如果ViewAViewB存在於不同的視圖層次結構中,那么可能更適合使用@EnvironmentObject

struct ViewA: View {
   @EnvironmentObject var searchData: SearchData
   /// ... other code

struct ViewB: View {
   @EnvironmentObject var searchData: SearchData
   /// ... other code

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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