SwiftUI、WidgetKit:使用计时器样式格式化日期

问题描述 投票:0回答:2

我有一个可以工作的时钟小部件。为了实现这一目标,我创建了一个每天更新一次的时间表。

func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
        let midnight = Calendar.current.startOfDay(for: Date())
        let nextMidnight = Calendar.current.date(byAdding: .day, value: 1, to: midnight)!
        let entries = [SimpleEntry(date: midnight)]
        let timeline = Timeline(entries: entries, policy: .after(nextMidnight))
        completion(timeline)
    }

小部件显示时钟如下:

var body: some View {
        
     VStack {
         Text(entry.date, style: .timer)            
     }         
}

我选择了这种方法,而不是每分钟创建一个条目时间线,因为我在文档中读到,系统不承诺按要求更新小部件,而是根据预算。

标签显示如下:

14:30:25

如何让它显示出来

下午 2:30 改为

ios swift swiftui widgetkit
2个回答
0
投票

如果您想在文本小部件中使用 .timer 样式,我认为没有直接的方法来自定义其格式。由于 SwiftUI 中的 .timer 样式负责倒计时您可以检查此查看有关 .timer 的文档。但是您可以使用 Timerpublisher 并根据需要调整 DateFormatter 轻松实现相同的目标。

您可以运行以下示例来实现您期望的行为:

struct StackOverFlow: View {
   @State private var currentDate = Date.now
   let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
   let timerFormatter: DateFormatter = {
     let formatter = DateFormatter()
     formatter.timeStyle = .medium
     return formatter
   }()
   var body: some View {
     Text("\(timerFormatter.string(from:currentDate))")
        .onReceive(timer) { input in
            currentDate = input
     }
   }
}

希望这个答案能解决您的问题。谢谢你。


-3
投票

您可以使用 DateFormatter 或直接使用 Text.init(_:formatter:)。 您也可以使用 Text.init(_:format:)

© www.soinside.com 2019 - 2024. All rights reserved.