UIButton限制印刷机数量

时间:2011-06-17 23:04:46

标签: iphone objective-c cocoa-touch

我遇到了一个问题,用户快速按下我的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;
    }
    }

}

2 个答案:

答案 0 :(得分:6)

您应该立即设置按钮的enabledhidden属性以禁用互动。

该更改只有在运行环的下一次转弯时才会生效,此时所有内容都会被重新绘制。正如您的代码所代表的那样,您的代码隐藏了按钮,执行操作,然后在按钮有机会重绘之前取消隐藏按钮

您应该做的是设置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:运行一段禁用按钮的代码,直到方法的逻辑完成。