我想在最初成功按下按钮后停止按下某个按钮一段时间。
我的第一个想法是使用计时器并在一定时间内禁用该按钮,但我不确定如何实现这个。
有人能给我指出正确的方向吗?
我正在使用 swift。
无需定时器。无需禁用。
点击按钮时,将当前日期存储在实例属性中。再次点击该按钮时,在将当前日期存储在同一实例属性中之前,从新日期中减去旧日期。如果它们距离太近,则不要同时执行按钮的操作,无论它是什么。
换句话说,只有当两个时间戳相距足够远时才采取行动。
这称为“去抖动”,是一种常见技术。搜索一下,你会发现这里有很多讨论。 编辑:现在不需要日期存储!只需使用组合框架的内置
debounce
运算符即可。
extension UIControl {
func preventRepeatedPresses(inNext seconds: Double = 1) {
self.isUserInteractionEnabled = false
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + seconds) {
self.isUserInteractionEnabled = true
}
}
}
###使用方法:###
@IBAction func pressedButton(_ sender: UIButton) {
sender.preventRepeatedPresses()
// do the job
}
所以:
var ButtonIsActiv = false
func buttonPressed(button: UIButton) {
if ButtonIsActiv == false {
// do something with your button
ButtonIsActiv = true
// after 3 seconds, activate it again
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) {
ButtonIsActiv = false
}
} else {
// your button is not activated
}
}
//
// ViewController.swift
// SwiftButtonStopStackOverflow
//
// Created by Seoksoon Jang on 29/09/2016.
// Copyright © 2016 Seoksoon Jang. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet var testButton: UIButton!
@IBAction func clickAction(_ sender: AnyObject) {
self.testButton.isEnabled = !self.testButton.isEnabled
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
self.testButton.isEnabled = !self.testButton.isEnabled
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(<YourMethod>), userInfo: nil, repeats: false)
另一种策略是按下按钮后,禁用与属性
userInteractionEnabled
的交互,然后使用计时器再次启用该属性。
extension UIButton {
override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
self.isUserInteractionEnabled = false
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.isUserInteractionEnabled = true
}
}
}
如果您确实希望能够重复敲击按钮,则可以为这些特定按钮使用特定的扩展类,或者为具有
@IBInspectable
类型的
Bool
的所有按钮创建自定义扩展类来设置按下特定按钮后是否应暂时停用。