SwiftUI:在打开视图时更改条件/ ObservableObject时更新视图

时间:2020-06-15 00:35:28

标签: ios swift swiftui

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

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

这是我最初的方法。

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

  1. 通过计时器在视图中进行轮询以获取当前日期的功能
  2. 我还考虑过首先计算剩余时间和ObservedObject内另一个线程中的计时器,该计时器在计时器达到0且视图中的onReceive修饰符时触发一个事件。

但是我想我的方法很糟糕,我会有更好的解决方法。

非常感谢您的帮助。

谢谢, 塞巴斯蒂安


SearchData:

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

1 个答案:

答案 0 :(得分:1)

const handleSubmit = (event) => { const form = event.currentTarget; if (form.checkValidity() === false) { event.preventDefault(); event.stopPropagation(); } setValidated(true); }; 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