swift - 为什么没有发出(或没有收到)significantTimeChangeNotification

标签 swift swiftui combine

我对 Swift 很陌生。出于学习目的,我正在创建一个小倒计时应用程序(距离 X 日期还有几天)。
这些倒计时显示在列表中。列表中的单个倒计时由以下 View 表示。

struct CountdownRow: View {
  @State private var remainingDays: Int = 0
  @State private var progress: Float = 0.0
  
  var countdown: Countdown
  
  var body: some View {
    VStack{
      HStack {
        Text(countdown.name)
          .font(.subheadline)
          .multilineTextAlignment(.leading)
          .padding(10)
        Spacer()
        Text(String(remainingDays))
          .font(.headline)
          .padding(10)
      }
      ProgressView(value: progress)
        .padding(10)
    }
    .onAppear {
      remainingDays = countdown.getRemainingDays()
      progress = countdown.getProgress()
    }
    .onReceive(NotificationCenter.default.publisher(for:
        UIApplication.significantTimeChangeNotification), 
        perform: { _ in
      remainingDays = countdown.getRemainingDays()
      progress = countdown.getProgress()
    })
  }
}
我想在午夜更新每个倒计时的剩余天数。但是当时间从 23:59 变为 0:00 时,.onReceive 修饰符不会触发。
接收其他通知(例如 UIApplication.willEnterForegroundNotification)会按预期工作。
为什么在午夜没有发出(或接收)这个特定的通知?
根据苹果的文档,它应该在午夜发出。
谢谢!

最佳答案

如果应用程序在前台,它会在午夜发出。您的应用程序在午夜处于前台吗?否则,您应该检查您返回前台的时间并进行相应更新。
所有 NSNotifications 都是如此。如果您的应用被暂停,它们将不会被接收。对于显着的TimeChangeNotification,这不是特殊情况。
willEnterForegroundNotification 可能看起来很特殊,但仅在您的应用程序已经重新启动的情况下才会发送。
也就是说,我强烈建议重新设计它,使 Countdown 成为一个 ObservableObject,并在适当的时间自我更新(通过观察显着TimeChangeNotification 和 willEnterForegroundNotification)。然后你可以绑定(bind) remainingDaysprogress不需要onAppearonReceive在 View 上。

关于swift - 为什么没有发出(或没有收到)significantTimeChangeNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67037463/

相关文章:

ios - 更新 UISplitView Controller 的两侧

swift - NSSearchField TextDidChange 的方法是什么?

swift - 调用SwiftUI的#11,#12处的额外参数

ios - TextField SwiftUI 关闭键盘

ios - iOS swift 中的错误域=NSCocoaErrorDomain 代码=3840?

ios - 如何创建只接受数字和一个点的 SwiftUI TextField?

swift - 使用 @ObservedObject 时是否可以在 Swift 中嵌套属性包装器?

SwiftUI 和 MVVM - 模型和 View 模型之间的通信

swift - Swift init 方法中的三个点

ios - iOS 9 中未调用 updateSearchResultsForSearchController