我想在最初成功按下按钮后停止按下一定的时间。
我的第一个想法是使用计时器并禁用按钮一段时间但是我不确定如何实现这个。
有人能指出我正确的方向吗?
我使用swift。
答案 0 :(得分:7)
无需计时器。不需要禁用。
点击按钮时,将当前日期存储在实例属性中。再次点击按钮时,就在将当前日期存储在同一实例属性中之前,从新日期中减去旧日期。如果它们距离太近,也不要执行按钮的动作,无论它是什么。
换句话说,只有当两个时间戳足够远时才采取行动。
这称为 debouncing ,是一种常用技术。进行搜索,你会在这里找到很多讨论。
答案 1 :(得分:4)
你不需要计时器,可以等几秒钟再次激活按钮。
所以:
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
}
}
答案 2 :(得分:3)
我认为这个扩展很方便:
extension UIButton {
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
}
答案 3 :(得分:1)
这个怎么样?
//
// 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.
}
}
答案 4 :(得分:0)
你的控制器中可能有一个Bool,说明按钮是否可操作,按下按钮时,设置Bool,并安排TimeInterval,如下所示:
Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(<YourMethod>), userInfo: nil, repeats: false)
另一种策略是在按下按钮后,禁用与属性userInteractionEnabled
的交互,然后使用Timer,再次启用该属性。
答案 5 :(得分:0)
如果要将其应用于应用程序中的所有按钮,则可以这样扩展UIButton:
extension UIButton {
override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
self.isUserInteractionEnabled = false
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
self.isUserInteractionEnabled = true
}
}
}
如果您确实希望重复敲击按钮,则可以为这些特定按钮使用特定的扩展类,或者为所有具有@IBInspectable Bool的按钮创建自定义扩展类,以设置是否按下某个特定按钮后应暂时停用