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

1 回答 1

3

关闭键盘是动画的,这足以让我们知道它在主线程上异步发生。换句话说 - 你的代码块开始,关闭被添加到主线程运行循环的键盘,线程休眠 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];不需要关心哪个文本字段是响应者。

于 2014-04-27T07:05:50.840 回答