2015-02-05 12 views
8

Tôi muốn ngăn nhiều lần nhấp liên tục trên cùng một UIButton.Làm thế nào để ngăn chặn nhiều sự kiện trên cùng một UIButton trong iOS?

Tôi đã thử với các thuộc tính enabledexclusiveTouch nhưng không hoạt động. Chẳng hạn như:

-(IBAction) buttonClick:(id)sender{ 
    button.enabled = false; 
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionAllowAnimatedContent animations:^{ 
     // code to execute 
    } 
    completion:^(BOOL finished){ 
     // code to execute 
    }]; 
    button.enabled = true; 
} 
+3

Set kích hoạt nên làm việc - hiển thị mã bạn đã cố gắng. – Paulw11

+0

như @ Paulw11 cho biết setEnable sẽ hoạt động, chúng tôi có thể giúp bạn tốt hơn nếu bạn cung cấp cho chúng tôi mã –

+0

Bạn có thể thêm một số mã số –

Trả lời

13

Điều bạn đang làm là bạn chỉ cần bật/tắt bật bên ngoài khối. Điều này là sai, thực thi của nó một khi phương pháp này sẽ gọi, do đó nó không vô hiệu hóa nút cho đến khi khối hoàn thành sẽ gọi. Thay vào đó, bạn nên bật lại sau khi hoạt ảnh của bạn hoàn thành.

-(IBAction) buttonClick:(id)sender{ 
    button.enabled = false; 
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionAllowAnimatedContent animations:^{ 
     // code to execute 
    } 
    completion:^(BOOL finished){ 
     // code to execute 
     button.enabled = true; //This is correct. 
    }]; 
    //button.enabled = true; //This is wrong. 
} 

Oh và có, thay vì truefalse, YESNO sẽ có vẻ tốt đẹp. :)

+0

Cảm ơn bạn. Tôi đã thử cùng một điều và nó đã làm việc – crazydev

+0

Đã không làm việc cho tôi, thay vào đó hãy thử: http://stackoverflow.com/a/32267367/2359049 –

0

Đây là giải pháp của tôi :

NSInteger _currentClickNum; // Lưu giá trị hiện tại của nút tag được nhấp

//Button click event 
- (void)tabBt1nClicked:(UIButton *)sender 
{ 
    NSInteger index = sender.tag; 
    if (index == _currentClickNum) { 
     NSLog(@"Click on the selected current topic, not execution method, avoiding duplicate clicks"); 
    }else { 
     [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(tabBtnClicked:) object:sender]; 
     sender.enabled = NO; 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
      sender.enabled = YES; 
     }); 
     _currentClickNum = index; 
     NSLog(@"Column is the current click:%ld",_currentClickNum); 
    } 
} 
0

Trong trường hợp của tôi thiết isEnabled là không đủ nhanh để ngăn chặn nhiều vòi. Tôi đã phải sử dụng một tài sản và một người bảo vệ để ngăn chặn nhiều vòi. Và phương thức hành động đang gọi một đại biểu mà thường loại bỏ bộ điều khiển xem nhưng với nhiều nút nhấn, nó không được loại bỏ. dismiss(...) phải tự hủy nếu mã vẫn đang thực thi trên bộ điều khiển chế độ xem, không chắc chắn. Bất kể, tôi phải thêm một hướng dẫn sử dụng dismiss trong bảo vệ.

Đây là giải pháp của tôi ...

private var didAlreadyTapDone = false 
private var didNotAlreadyTapDone: Bool {return !didAlreadyTapDone} 

func done() { 
    guard didNotAlreadyTapDone else { 
     self.dismiss(animated: true, completion: nil) 
     return 
    } 
    didAlreadyTapDone = true 
    self.delegate.didChooseName(name) 
} 
Các vấn đề liên quan