class viewcontroller1: UIViewController {
我有这两张照片。单击下一个按钮时,image1将在10秒后更改为image2。但是,如果在10秒过期之前再次单击下一个按钮,我不知道如何取消/重置延迟动作。这是我到目前为止的代码......
var image1: UIImageView!
var image2: UIImageView!
func delay(_ delay:Double, closure:@escaping ()->()) {
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
@IBAction func nextbutton(_ sender: Any) {
image1.image = UIImage(named: "image1")
delay(10) { self.image2.image = UIImage(named: "image2")
}
}
}
我真的很感激任何帮助。感谢
答案 0 :(得分:0)
anyncAfter
无法取消
根据评论,您必须使用以下Timer
示例
创建全局变量
var timer:Timer?
和行动
@IBAction func btnImageChangedTapped(_ sender: UIButton) {
if (self.timer != nil) {
self.timer?.invalidate()
self.timer = nil;
}
timer = Timer.scheduledTimer(timeInterval: yourTime, target: self, selector: #selector(changeImage:), userInfo: sender, repeats: false)
}
答案 1 :(得分:0)
var timer:Timer?
func startTimer(){
timer = Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(self.YourImageChangeAction), userInfo: nil, repeats: false)
}
func resetTimer(){
timer?.invalidate()
startTimer()
}
将func resetTimer添加到您的UiButton发件人。
答案 2 :(得分:0)
您可以在VC中使用点击计数器,并在执行延迟代码时对其进行测试。
例如:
var clickCount = 0
@IBAction func nextbutton(_ sender: Any)
{
clickCount += 1
let wantsClickCount = clickCount
image1.image = UIImage(named: "image1")
delay(10)
{
guard self.clickCount == wantsClickCount
else { return }
self.image2.image = UIImage(named: "image2")
}
}
如果在关闭执行之前再次单击该按钮,则clickCount将不再匹配,并且定时代码将不执行任何操作。
这甚至可以快速点击。请注意,它会每次将图像更改推迟10秒,因此图像更改将始终在最后一次点击后10秒发生。