UIButton, ограничивающий количество нажатий - PullRequest
0 голосов
/ 18 июня 2011

У меня возникла проблема с пользователями, которые быстро нажимали на мою 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 ]

6 голосов
/ 18 июня 2011

Вы должны немедленно установить свойство 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];
    });
  });
}
0 голосов
/ 18 июня 2011

В селекторе кнопки используйте -performSelectorOnMainThread:withObject:waitUntilDone: для запуска фрагмента кода, который отключает кнопку до тех пор, пока логика метода не будет завершена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...