我有一个可以工作的时钟小部件。为了实现这一目标,我创建了一个每天更新一次的时间表。
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 改为
如果您想在文本小部件中使用 .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
}
}
}
希望这个答案能解决您的问题。谢谢你。
您可以使用 DateFormatter 或直接使用 Text.init(_:formatter:)。 您也可以使用 Text.init(_:format:)