min*_*tuz 0 iphone cocoa-touch objective-c
用户快速按下我的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您应该立即设置按钮的enabled
或hidden
属性以禁用交互.
然而,直到下一轮runloop,当一切都被重新绘制时,这种改变才会生效.正如您的代码所代表的那样,您的代码隐藏了按钮,执行操作,然后取消隐藏按钮,所有这些都在按钮有机会重绘之前.
你应该做的是设置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];
});
});
}
Run Code Online (Sandbox Code Playgroud)