Question

This function is designed to simulate a wait if the user is successful logging in. As you can see I dismiss the keyboard first but that doesn't stop NSThread from sleeping before the keyboard is dismissed. I think I need to harness the power of the dispatch queue but not quite sure. Any way I can dismiss the keyboard before sleep occurs?

-(IBAction)userLoginButtonPressed:(id)sender
{
    /* resign first responders so that the user
     can see the label of the server trying to log in */
    [self.usernameField resignFirstResponder];
    [self.passwordField resignFirstResponder];
    self.statusLabel.text = @"Logging In...";

    // create the server object and pass in the username and password values
    IONServer *server = [[IONServer alloc] init];
    NSString *user = self.usernameField.text;
    NSString *pw = self.passwordField.text;
    [server loggingInWithUserName:user password:pw];

    // redirect based on result
    if (server.result.success) {
        [self serverSuccess];
        [NSThread sleepForTimeInterval:2.0f];
    } else {
        [self serverFailure];
    }

    // store the server object as this class' server var
    self.server = server;
    NSLog(@"Result From Server: %@", server.result);
}
Was it helpful?

Solution

dismissing the keyboard is animated and this is enough for us to know that it happens async-ly, on main thread. In other words - you code block starts, dismissing the keyboard being added to main thread runloop, the thread sleeps for 2 seconds because you said so (Terrible thing to do if you ask me), and only than it's the keyboard's turn to get animated down and be dismissed.

A nice trick can be

[UIView animateWithDuration:0 animations: ^{
    [self.usernameField resignFirstResponder];
    [self.passwordField resignFirstResponder];
} completion: ^(BOOL finished) {
    // Do whatever needed...
    [NSThread sleepForTimeInterval:2.0f];
}];

BUT - I highly recommend finding a better solution than freezing the main thread.

Also - no what you asked for, but, assuming all your text fields are subviews of self.view you can just call [self.view endEditing:YES]; and you don't need to care about which text field is corrently the responder.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top