Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SwiftUI:当视图打开时条件/观察对象发生更改时更新视图_Ios_Swift_Swiftui - Fatal编程技术网

Ios SwiftUI:当视图打开时条件/观察对象发生更改时更新视图

Ios SwiftUI:当视图打开时条件/观察对象发生更改时更新视图,ios,swift,swiftui,Ios,Swift,Swiftui,我想这很可能是一个愚蠢的问题,但目前我正在努力。 为了避免大量代码,我简化了代码(见下文),但它应该会显示问题所在 我有多个不属于父母关系的观点。 在一个视图(ViewA)中,我设置了一个目标日期。在另一个视图(ViewB)上,我显示文本,这取决于目标日期是否在将来。 对于这两个视图,我都使用了ObservieObject。 我希望ViewB在打开并且达到目标日期时更改文本。因为我使用的是@Published标签,所以我希望它能直接工作。 但不幸的是,什么也没有发生 这是我最初的做法 我测试了更

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

我有多个不属于父母关系的观点。 在一个视图(ViewA)中,我设置了一个目标日期。在另一个视图(ViewB)上,我显示文本,这取决于目标日期是否在将来。 对于这两个视图,我都使用了ObservieObject。 我希望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")
           }
       }
    }
    
    struct ViewA: View {
       @ObservedObject var searchData = SearchData()
    
       func setDate() {
           searchData.targetDate = Date() + 120
       }
    
       var body: some View {
    
           Button(action: {
               self.setDate()
           }) {
               Text("Set Date")
           }
       }
    }
    
    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()
       }
    }
    

    查看A:

    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")
           }
       }
    }
    
    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()
       }
    }
    

    视图B:

    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")
           }
       }
    }
    
    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
    实例。如您所写,为了直接发布作品,两个视图都必须使用一个可观察对象的实例

    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
    

    检查此逻辑(searchData.targetDate>Date())并将中的Date()更改为某物。。。我觉得这就是问题所在。实际上我没有在我的Mac电脑上运行这个,如果你总是收到文本(“文本A”)。。。那么问题就在这里。谢谢!我真的重新考虑了我的情况,事实上,我所做的一切都没有意义。现在我有了一个有效的解决方案。