[英]View refreshing not triggered when ObservableObject is inherited in SwiftUI
[英]SwiftUI: Update views when conditions / ObservableObject changed while view is opened
我想這很可能是一個愚蠢的問題,但目前我正在努力。 為了避免大量代碼,我簡化了代碼(見下文),但它應該顯示問題。
我有多個不屬於父母關系的觀點。 在一個視圖 (ViewA) 上,我設置了一個目標日期。 在另一個視圖 (ViewB) 上,我根據目標日期是否在未來顯示文本。 對於這兩個視圖,我都使用 ObservableObject。 我希望 ViewB 在打開時更改文本並且達到目標日期。 由於我使用標簽@Published,我期待它直接工作。 但不幸的是,什么也沒有發生。
這是我最初的方法。
我測試了更多解決方案,例如
但我想我的方法非常糟糕,我會有更好的解決方案。
非常感謝您的幫助。
謝謝,塞巴斯蒂安
搜索數據:
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()
}
}
ViewA
和ViewB
使用不同的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)
如果ViewA
和ViewB
存在於不同的視圖層次結構中,那么可能更適合使用@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.