如果在执行延迟时间之前单击触发它的相同按钮,如何取消延迟操作?

时间:2017-08-25 04:37:25

标签: ios swift

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

我真的很感激任何帮助。感谢

3 个答案:

答案 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秒发生。