SwiftUI使用“.timer”更改“Text”的输出格式`
有没有办法使用SwiftUI使用“.timer”更改“Text”的输出格式`,swiftui,ios14,swiftui-text,Swiftui,Ios14,Swiftui Text,有没有办法使用init(uDate:date,style:Text.DateStyle)更改文本的输出格式 使用.timer,输出类似于:0:42,但我希望类似于00:00:42 背景 我想创建一个运行计时器的小部件(iOS 14),因为我认为每秒触发一次小部件更新不是一个好主意,这甚至可能无法可靠地工作,至少小部件不是这样缩进使用的。 所以我考虑使用Text的预定义计时器功能 我对SwiftUI很陌生,还不太了解所有的功能。也许我可以自己创建一个类似的自定义文本视图?关于如何实现这一点有什么
init(uDate:date,style:Text.DateStyle)
更改文本的输出格式
使用.timer
,输出类似于:0:42
,但我希望类似于00:00:42
背景
我想创建一个运行计时器的小部件(iOS 14),因为我认为每秒触发一次小部件更新不是一个好主意,这甚至可能无法可靠地工作,至少小部件不是这样缩进使用的。
所以我考虑使用Text
的预定义计时器功能
我对SwiftUI很陌生,还不太了解所有的功能。也许我可以自己创建一个类似的自定义文本视图?关于如何实现这一点有什么想法吗
或者换一种方式问:有没有一种方法可以自己创建这样的自更新组件,它也可以在iOS14小部件中工作?(似乎使用Timer.publish
更新视图在iOS 14小部件中不起作用)无解决方案=>解决方法
到今天为止,似乎还没有一个合适的解决方案。但是,由于对“解决方案”或解决方案的兴趣似乎已经存在,我现在只想发布我的最终结果
代码
基本上,我只是每秒手动更新文本一次,然后计算从参考日期到“现在”的差值
struct SomeView:View{
让referenceDate=Date()//字符串{
让格式化程序=DateComponentsFormatter()
formatter.allowedUnits=allowedUnits
formatter.zeroFormattingBehavior=.pad
返回格式化程序.string(from:DateComponents(second:self))
}
}
WidgetKit限制
不幸的是,这不适用于WidgetKit
,因为计时器没有运行,或者至少UI没有刷新。最后,我在小部件中只显示了几分钟(这对我来说还行),只是在“时间线”中为每分钟设置了一个更新。你明白了吗?我认为这(目前)是不可能的。我刚刚使用了一个普通的文本和一个计时器来计算当前相对于参考日期的偏移量并触发一个更新。你能分享一下你的代码吗?我正在努力实现同样的目标functionality@Oscar我在下面贴了一个答案,关于我是如何“解决”这个问题的。谢谢你的帮助,因为我发现(正如你在回答中提到的)这在小部件中是不可能的,无论如何,谢谢你,虽然我正在尝试创建一个时钟小部件,拥有小时和分钟对我来说已经足够了,我认为你的解决方案会非常好,但我无法使用上面的代码,请你为widgetKit共享实现这一点的代码(小时和分钟)好吗?
struct SomeView: View {
let referenceDate = Date() // <- Put your start date here
@State var duration: Int = 0
let timer = Timer.publish(every: 1, on: .current, in: .common).autoconnect()
var body: some View {
Text(self.duration.formatted(allowedUnits: [.hour, .minute, .second]) ?? "")
.onReceive(self.timer) { _ in
self.duration = referenceDate.durationToNow ?? 0
}
}
}
extension Date {
var durationToNow: Int? {
return Calendar.current
.dateComponents([.second], from: self, to: Date())
.second
}
}
extension Int {
func formatted(allowedUnits: NSCalendar.Unit = [.hour, .minute]) -> String? {
let formatter = DateComponentsFormatter()
formatter.allowedUnits = allowedUnits
formatter.zeroFormattingBehavior = .pad
return formatter.string(from: DateComponents(second: self))
}
}