![](/img/trans.png)
[英]Can't pass AudioQueueRef inout parameter to AudioQueueNewOutput in Swift
[英]Swift - Pass inout parameter to scheduledTimer
有沒有辦法通過 scheduleTimer 方法傳遞 inout 參數? 我想要一個特定的值(在計時器用完之前禁用按鈕)。
func Timer(Hz:TimeInterval, Activate: inout Bool, time:Double=10){
let info = ProcessInfo.processInfo
let begin = info.systemUptime
var A=0
// do something
var diff = (info.systemUptime - begin)
print("Time runs\n")
let timer=Timer.scheduledTimer(withTimeInterval: Hz, repeats: true) { timer in
diff=(info.systemUptime - begin)
if (diff>=time){
timer.invalidate()
print("Finished")
Activate = !Activate
A=1
}
}
if (A==1){
print("Will never happen")
}
}
Var A 只是為了表明我也嘗試了另一種方法,但沒有奏效
如果按鈕是引用類型(即類),如果它是 UIKit 或 AppKit 類型,則可以將其傳入,但有一種更通用的方法可能會更好。 傳入一個閉包作為完成處理程序:
func Timer(Hz:TimeInterval, time:Double=10, onCompletion handler: @escaping () -> Void){
let info = ProcessInfo.processInfo
let begin = info.systemUptime
var A=0
// do something
var diff = (info.systemUptime - begin)
print("Time runs\n")
let timer=Timer.scheduledTimer(withTimeInterval: Hz, repeats: true) { timer in
diff=(info.systemUptime - begin)
if (diff>=time){
timer.invalidate()
print("Finished")
A=1
handler() // <- Call completion handler here
}
}
if (A==1){
print("Will never happen")
}
}
然后你可以像這樣禁用按鈕:
Timer(Hz: hz, time: time) { myButton.isEnabled = false /* or whatever else you want to do */ }
您的代碼似乎不必要地復雜(盡管我可能沒有理解目標)。 假設我們想要禁用我們的按鈕 10 秒鍾,然后應該再次啟用它。 那我們就說
self.myButton.isEnabled = false
self.toggleEnabled(self.myButton, after:10)
其中toggleEnabled
看起來像這樣:
func toggleEnabled(_ enabled:UIButton, after t:Double) {
Timer.scheduledTimer(withTimeInterval: t, repeats: false) { _ in
enabled.isEnabled.toggle()
}
}
如果你真的想要,你可以使用一個協議來隱藏toggleEnabled
這是一個 UIButton 的事實。 但這幾乎不需要做這么簡單的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.