gpt4 book ai didi

swift - 如何在 swiftUI 中 x 秒后触发操作

转载 作者:行者123 更新时间:2023-11-30 10:28:20 25 4
gpt4 key购买 nike

我一直在努力实现两个令我头疼的主要目标。抱歉,如果这是一个简单的修复,我对 swift/swiftui 还是有点陌生​​

  1. 经过一定时间后触发操作。
  2. 触发 @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 和新的并发更新(asyncawait),您现在可以使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com