避免点击触发多个按钮和快速点击多次触发事件

本文介绍了两种有效的UIButton防重复点击方法。一种通过设置按钮的exclusiveTouch属性为YES避免多个按钮同时响应;另一种利用延迟和取消之前的执行请求实现精确控制,确保用户连续点击时只有首次点击生效。

注:文章内容摘自其他文章,仅用个人学习。

在测试应用时,有时会变态的将两个UIButton同时按住来测试,结果就是两个按钮会同时响应,会出现同时push两个viewcontroller等非正常情况。为了避免用户误操作造成这类问题,只需要给自己的UIButton添加以下代码。

    self.btnPerson = [UIButton buttonWithType:UIButtonTypeCustom];

    [self.btnPerson setExclusiveTouch:YES]

exclusiveTouch 
A Boolean value that indicates whether the receiver handles touch events exclusively.


有时候有些操作是防止用户在一次响应结束中再响应下一个。但有些测试用户就要猛点,狂点。像这种恶意就要进行防止。

当然有些异步操作时,可以在调用前enable 掉。等CallBACK 后再enable起来。过程中按钮是不能点的。


1、可以使用:

- (void) timeEnough

{

  UIButton *btn=(UIButton*)[self.view viewWithTag:33];

  btn.selected=NO; 

[timer invalidate];

  timer=nil; 

}


 - (void) btnDone:(UIButton*)btn

 {

 if(btn.selected) return;

 btn.selected=YES;

 [self performSelector:@selector(timeEnough) withObject:nil afterDelay:3.0]; //使用延时进行限制。

//to do something.


2、个人觉得这种方法更为好用些。

- (void)todoSomething:(id)sender

{

    //在这里做按钮的想做的事情。

}


- (void)starButtonClicked:(id)sender

{

    //先将未到时间执行前的任务取消。

    [[self classcancelPreviousPerformRequestsWithTarget:self selector:@selector(todoSomething:object:sender];

    [self performSelector:@selector(todoSomething:withObject:sender afterDelay:0.2f];

}


对于第二种方法,快速点击N次,只要每次间隔在0.2秒内的都不响应操作,等到停下点击到达0.2秒后再执行。所以按照自己的需要设置响应时间,狂点吧。只响应一次。。


在 C# 中,按钮(`Button` 控件)的 `Click` 事件在用户频繁点击时确实可能会被多次触发。这种行为是由于每次点击都会生成一个独立的 `Click` 消息并提交到消息队列中,进而触发事件处理程序。例如,如果用户快速点击按钮多次每次点击都会独立触发 `Click` 事件,这可能导致事件处理程序被多次执行[^1]。 这种行为在 Windows Forms 应用程序中尤为常见。例如,以下代码展示了一个简单的按钮点击事件处理程序: ```csharp private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Button clicked!"); } ``` 如果用户快速点击按钮多次,`MessageBox` 会依次弹出多次每次对应一次点击操作。 为了避免频繁点击导致的多次触发问题,可以通过以下几种方法进行控制: 1. **禁用按钮**:在事件处理程序中暂时禁用按钮,防止用户在处理过程中再次点击。 ```csharp private void button1_Click(object sender, EventArgs e) { button1.Enabled = false; // 执行操作 // ... button1.Enabled = true; } ``` 2. **使用标志变量**:通过一个布尔变量来跟踪按钮是否正在处理操作,从而阻止重复触发。 ```csharp private bool isProcessing = false; private void button1_Click(object sender, EventArgs e) { if (isProcessing) return; isProcessing = true; // 执行操作 isProcessing = false; } ``` 3. **使用 `async/await`**:在异步操作中,可以利用 `async/await` 来处理长时间任务,同时避免阻塞 UI 线程。 ```csharp private async void button1_Click(object sender, EventArgs e) { button1.Enabled = false; await Task.Run(() => { // 执行耗时操作 }); button1.Enabled = true; } ``` 这些方法可以有效防止因频繁点击导致的多次事件触发问题,从而提升用户体验应用程序的稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值