【问题标题】:How to stop timer in Text view?如何在文本视图中停止计时器?
【发布时间】:2020-08-15 10:34:33
【问题描述】:

可以在 SwiftUI 中将日期传递给 Text(),然后使用 style 参数将其格式化为计时器。然而,像这样的倒计时永远不会停止,它只是在零之后不断增加。如何让它停在0?

func nextRollTime(in seconds: Int) -> Date {
    let date = Calendar.current.date(byAdding: .second, value: seconds, to: Date())
    return date ?? Date()
}

上面是我用来开始倒计时的函数,然后我传递如下:

Text(nextRollTime(in: 20), style: .timer)

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    这是一个可能的方法的演示 - 因为.timer 从现在开始永远运行(按设计),其想法是在指定时间段结束后将其替换为常规文本。

    使用 Xcode 12b3 / iOS 14 测试。

    struct DemoView: View {
        @State private var run = false
    
        var body: some View {
            VStack {
                if run {
                    Text(nextRollTime(in: 10), style: .timer)
                } else {
                    Text("0:00")
                }
            }
            .font(Font.system(.title, design: .monospaced))
            .onAppear {
                self.run = true
            }
        }
    
        func nextRollTime(in seconds: Int) -> Date {
            let date = Calendar.current.date(byAdding: .second, value: seconds, to: Date())
            DispatchQueue.main.asyncAfter(deadline: .now() + Double(seconds)) {
                self.run = false
            }
            return date ?? Date()
        }
    }
    

    【讨论】:

    • 谢谢!奇迹般有效。应该考虑 DQ 方法。
    • 很好奇,您的示例运行良好,但在我的项目中,它无法正确更新 Text(),尽管经过的时间是正确的。它直接跳到最后几秒钟(有滞后)。关于如何调试的任何想法?
    猜你喜欢
    • 2022-01-20
    • 2022-12-02
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多