我想这很可能是一个愚蠢的问题,但目前我正在努力。
为了避免编写大量代码,我简化了代码(请参见下文),但是它应该可以显示问题。

我有多个不在父母关系中的视图。
在一个视图(ViewA)上,我设置了目标日期。在另一个视图(ViewB)上,根据目标日期是否在将来,显示文本。
对于这两个视图,我都使用一个ObservableObject。
我希望ViewB在打开文本并在那时达到目标日期时更改文本。由于我使用的是@Published标签,因此我期望它可以直接使用。
但不幸的是,没有任何反应。

这是我最初的方法。

我测试了更多解决方案,例如

在视图中由计时器轮询

  • ,并带有获取当前日期的功能
  • 我还考虑过首先计算剩余时间和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")
           }
       }
    }
    

    查看A:
    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的不同实例。如您所写,要直接使已发布的作品生效,两个视图都必须使用和可观察对象的实例。

    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
    

    关于ios - SwiftUI:在打开 View 时更改条件/ObservableObject时更新 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62379742/

    10-09 09:37