簡體   English   中英

如何在 swiftUI 中 x 秒后觸發操作

[英]How to trigger action after x seconds in 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()
            }
    }
}

但是我將如何合並它以便在 7.5 秒后可以使用類似@State東西將我的值更改為false

@State randomTF : Bool = true

或者在 7.5 秒后將Text("Please Enter Above")更改為Text("Sorry Too Late")

創建一個延遲,然后在時間過去@State屬性hasTimeElapsedtrue ,從而更新視圖主體。

使用 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)
        await Task.sleep(7_500_000_000)
        hasTimeElapsed = true
    }
}

此答案中查看有關Task.sleep(_:)更多信息。


舊版本

對於以下:

  • iOS 15.0+
  • macOS 12.0+
  • Mac 催化劑 15.0+
  • tvOS 15.0+
  • watchOS 8.0+
  • Xcode 13.0+

您可以使用DispatchQueue來延遲某些事情。 onAppear(perform:)觸發它onAppear(perform:)當視圖第一次出現時發生)。 如果需要,您也可以將延遲連接到 Button。

例子:

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

.delay內置於 Swift 動畫中。 我實現了在視圖出現后 0.5 秒啟動動畫的目標,代碼如下:

 .onAppear(perform: {
    withAnimation(Animation.spring().delay(0.5)) {
         self.scale = 1.0
    }
 })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM