【问题标题】:How do I prevent repeated button presses in iOS?如何防止在 iOS 中重复按下按钮?
【发布时间】:2017-02-07 16:12:01
【问题描述】:

我想在最初成功按下按钮后停止按下按钮一段时间。
我的第一个想法是使用计时器并禁用按钮一段时间,但我'我不确定如何实现这一点。

有人能指出我正确的方向吗?

我正在使用 swift。

【问题讨论】:

    标签: ios swift swift3


    【解决方案1】:

    如果您希望它应用于您应用中的所有按钮,您可以这样扩展 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: .now() + 2) {
                self.isUserInteractionEnabled = true
            }
        }
    }
    

    如果您确实希望能够反复敲击按钮,您可以为这些特定按钮使用特定的扩展类,或者为所有具有@IBInspectable 类型为Bool 的按钮创建自定义扩展类设置特定按钮在按下后是否应暂时停用。

    【讨论】:

      【解决方案2】:

      斯威夫特 3.0

      我认为这个扩展很方便:

      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】:

      您不需要计时器,可以等待几秒钟然后再次激活按钮。

      所以:

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

      【讨论】:

        【解决方案4】:

        这个怎么样?

        //
        //  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.
            }
        
        }
        

        【讨论】:

          【解决方案5】:

          不需要计时器。无需禁用。

          点击按钮时,将当前日期存储在实例属性中。当再次点击按钮时,就在您将当前日期存储在同一个实例属性中之前,从新日期中减去旧日期。如果它们靠得太近,无论是什么,都不要执行按钮的操作。

          换句话说,只有当两个时间戳相距足够远时,您才会采取行动。

          这称为去抖动,是一种常见的技术。进行搜索,您会在这里找到很多关于它的讨论。

          【讨论】:

            【解决方案6】:

            你可以在你的控制器中有一个 Bool 来说明按钮是否可操作,当按下按钮时,设置 Bool,并安排一个 TimeInterval,如下所示: Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(&lt;YourMethod&gt;), userInfo: nil, repeats: false)

            另一种策略是在按下按钮后,禁用与属性 userInteractionEnabled 的交互,然后使用 Timer,再次启用该属性。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-11-08
              • 1970-01-01
              • 2016-05-20
              • 1970-01-01
              • 2023-03-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多