[英]How to trigger action after x seconds in swiftUI
我一直在努力實現兩個令我頭疼的主要目標。 對不起,如果這是一個簡單的修復,我對 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()
}
}
}
但是我將如何合並它以便在 7.5 秒后可以使用類似@State
東西將我的值更改為false
:
@State randomTF : Bool = true
或者在 7.5 秒后將Text("Please Enter Above")
更改為Text("Sorry Too Late")
創建一個延遲,然后在時間過去@State
屬性hasTimeElapsed
為true
,從而更新視圖主體。
使用 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(_:)
更多信息。
對於以下:
您可以使用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.