我一直在努力实现两个令我头疼的主要目标。抱歉,如果这是一个简单的修复,我对 swift/swiftui 还是有点陌生
- 经过一定时间后触发操作。
- 触发
@State
根据过去的时间更改值。
我在 Stack Overflow 上进行了搜索,找到了建议使用计时器的答案:
struct CurrentDateView : View {
@State var now = Date()
let timer = Timer.publish(every: 1, on: .current, in: .common).autoconnect()
var body: some View {
Text("\(now)")
.onReceive(timer) {
self.now = Date()
}
}
}
但是我该如何合并它,以便可以使用像 @State
这样的东西,在 7.5 秒过去后将我的值更改为 false
:
@State randomTF : Bool = true
或者 Text("Please Enter Below")
在 7.5 秒后更改为 Text("Sorry Too Late")
最佳答案
创建一个延迟,然后在时间过去时将@State
属性hasTimeElapsed
设置为true
,从而更新 View 主体。
借助 Swift 5.5 和新的并发更新(async
和 await
),您现在可以使用 task(_:)
像下面这样:
struct ContentView: View {
@State private var hasTimeElapsed = false
var body: some View {
Text(hasTimeElapsed ? "Sorry, too late." : "Please enter above.")
.task(delayText)
}
private func delayText() async {
// Delay of 7.5 seconds (1 second = 1_000_000_000 nanoseconds)
try? await Task.sleep(nanoseconds: 7_500_000_000)
hasTimeElapsed = true
}
}
查看 this answer 中有关 Task.sleep(nanoseconds:)
的更多信息.
旧版本
Xcode 13.0+ 现在支持并发,向后兼容!然而,这仍然是“旧”的方法:
您可以使用DispatchQueue
拖延某事。使用 onAppear(perform:)
触发它(当 View 第一次出现时发生)。如果需要,您也可以将延迟连接到按钮。
示例:
struct ContentView: View {
@State private var hasTimeElapsed = false
var body: some View {
Text(hasTimeElapsed ? "Sorry, too late." : "Please enter above.")
.onAppear(perform: delayText)
}
private func delayText() {
// Delay of 7.5 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 7.5) {
hasTimeElapsed = true
}
}
}
关于swift - 如何在 swiftUI 中 x 秒后触发操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59682446/