swift 如何在“文本”视图中停止计时器?

xdnvmnnf  于 11个月前  发布在  Swift
关注(0)|答案(2)|浏览(130)

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

uwopmtnx

uwopmtnx1#

这里是一个可能的方法的演示-因为.timer从现在开始永远运行(根据设计),想法是一旦指定的时间段结束,就用常规文本替换它。
使用Xcode 12 b3/ iOS 14进行测试。
x1c 0d1x的数据

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

字符串

nnt7mjpx

nnt7mjpx2#

iOS16+ / macOS 13+

Text现在有一个专用的初始化器init(timerInterval:pauseTime:countsDown:showsHours:)
你可以这样使用它:

let date = Date()
Text(timerInterval: date...date.addingTimeInterval(9), countsDown: true)

字符串

相关问题