2014-04-27 26 views
1

此功能用于模拟用户成功登录时的等待。正如您所看到的,我先关闭键盘,但这并不会阻止NSThread在键盘被解除前进入休眠状态。我认为我需要利用调度队列的力量,但不太确定。任何方式我可以在睡眠发生之前关闭键盘?在模拟等待时关闭键盘

-(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); 
} 

回答

3

解除键盘动画,这足以让我们知道它发生在主线程上的异步。换句话说 - 你编码块开始,解除键盘被添加到主线程runloop,线程睡2秒,因为你这么说(如果你问我,可怕的事情),只有它的键盘轮到获得动画下来并被解雇。

一个好的技巧可以

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

但是 - 我强烈建议寻找比冷冻主线程更好的解决方案。

此外 - 没有你要求的,但是,假设你所有的文本字段都是self.view的子视图,你可以调用[self.view endEditing:YES];,你不需要关心哪个文本字段是响应者。

+0

我会接受答案(附加提示),但你可能想要更新块[UIView animateWithDuration:0 动画:^ {self.view endEditing:YES]; }完成:^(BOOL完成){NSThread sleepForTimeInterval:2.0f]; }]; – Macness

+0

谢谢。我编辑了我的答案,我编写了代码,并假设了一些错别字。 –