我遇到了一个问题,用户快速按下我的UIButton会导致多个条目被放置在我的数据库中。我已经尝试了各种各样的方法,例如在调用动作时隐藏按钮以及某种切换,两者都不成功。反正将印刷机限制在一个。该动作与按钮内部参考的修饰相关联。
-(IBAction)postData:(id)sender
{
if(loginControl == 0)
{
if(nameIB.text.length && numberIB.text.length > 0)
{
loginControl = 1;
loginButton.hidden = YES;
NSMutableData *data = [NSMutableData data];
NSString *number = numberIB.text;
NSString *name = nameIB.text;
NSString *nameString = [[NSString alloc] initWithFormat:@"name=%@", name];
NSString *numberString = [[NSString alloc] initWithFormat:@"&number=%@", number];
NSString *genderString = [[NSString alloc] initWithFormat:@"&gender=%@", gender];
//NSLog(nameString);
//NSLog(numberString);
[data appendData:[nameString dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[numberString dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[genderString dataUsingEncoding:NSUTF8StringEncoding]];
NSURL *url = [NSURL URLWithString:@"http://www.blah.net/blah.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:data];
NSURLResponse *response;
NSError *err;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
NSLog(@"responseData: %@", responseData);
userData = responseData;
[self startParsingUserId];
logoutButton.hidden = NO;
}
else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Text Fields Empty" message:@"One Or More Textfields Are Empty" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alert show];
[alert release];
loginControl = 0;
}
}
}
答案 0 :(得分:6)
您应该立即设置按钮的enabled
或hidden
属性以禁用互动。
但该更改只有在运行环的下一次转弯时才会生效,此时所有内容都会被重新绘制。正如您的代码所代表的那样,您的代码隐藏了按钮,执行操作,然后在按钮有机会重绘之前取消隐藏按钮。
您应该做的是设置hidden
属性,然后开始计算(最好是在后台线程上)。只有在计算完成后,您应该通知主线程再次取消隐藏按钮。
如果您只在iOS 4.0+上使用此功能,那么您可以通过Grand Central Dispatch轻松完成此任务:
- (IBAction)doStuff:(id)sender {
[button setEnabled:NO];
dispatch_async(dispatch_get_global_queue(0,0), ^{
// do all your computation/synchronous requesting here
// this will happen on a background thread
dispatch_async(dispatch_get_main_queue(), ^{
[button setEnabled:YES];
});
});
}
答案 1 :(得分:0)
在按钮的选择器中,使用-performSelectorOnMainThread:withObject:waitUntilDone:
运行一段禁用按钮的代码,直到方法的逻辑完成。