禁用缓冲重复按钮点击

时间:2011-08-18 02:20:21

标签: objective-c ios xcode interface

当用户单击按钮时,将启动一个操作,但如果用户快速单击该按钮10次,则会执行10次。我想在控件从事件返回之前禁用才会生效。

- (IBAction)btnQuickCheckClick:(id)sender {
  @try {
    self.btnQuickCheck.enabled = NO ;
    // Next line takes about 3 seconds to execute:
    [self pollRouter] ;
  }  
  @finally {
    self.btnQuickCheck.enabled = YES ;
  }    
}

2 个答案:

答案 0 :(得分:1)

您可以在轮询前禁用按钮后运行运行循环来更新UI:

- (IBAction)btnQuickCheckClick:(id)sender {
    self.btnQuickCheck.enabled = NO;
    // give some time for the update to take place
    [self performSelector:@selector(pollRouterMethod) withObject:nil afterDelay:0.1];   
}
- (void)pollRouterMethod {
    @try {
        [self pollRouter];
    } @catch (NSException * e) { }
    // re-enable the button
    self.btnQuickCheck.enabled = YES;
}

当然,这种方法无法替代在另一个线程上运行时间密集型任务。对于长期任务,多线程几乎总是可行的。

答案 1 :(得分:1)

另一种方法是使用块:

Big Pro:您不需要创建额外的方法:)

- (IBAction)btnQuickCheckClick:(id)sender {
    //UI changes must be done in the main thread
    self.btnQuickCheck.enabled = NO;

    //do your thing in a background thread
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT ,0);
    dispatch_async(queue, ^(){
        @try {
            //do your thing here
            [self pollRouter];

        } @catch (NSException * e) {
            //handle the exception, if needed

        } @finally {
            //change to the main thread again and re-enable the UI
            dispatch_queue_t mainQueue = dispatch_get_main_queue();
            dispatch_async(mainQueue, ^(){
                self.btnQuickCheck.enabled = YES;
            });
        }
    });
}

这将在后台线程中运行pollRouter。因此,如果你没有修改UI或其他非线程安全的东西,你想使用这种方法:)否则去@ Alex的方法