Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI使用“.timer”更改“Text”的输出格式`_Swiftui_Ios14_Swiftui Text - Fatal编程技术网

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