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

标签 swift xcode timer swiftui

我一直在努力实现两个令我头疼的主要目标。抱歉,如果这是一个简单的修复,我对 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/

相关文章:

iphone - 一个部分中的一个部分 - UITableView -

javascript - Javascript中的时钟

c++ - 来自其他类的 asio 计时器

ios - 在 Cloud Firestore 中存储自定义对象数组的正确方法?

swift - 无法在 IOS10 中锁定一个 View Controller 的旋转

json - 使用 guard 语句从 json 解包到 AnyObject

c# - 为什么Windows.Forms.Timer的时间间隔随着tick的增加而减少?

swift - 在 Swift 中实现响应者 Action

javascript - WKWebView 弹出窗口未显示

ios - 带有目标模拟器的 XCode 5 权利的编译警告