0

所以我试图简单地每当用户按下 UITextField 上的返回键时,键盘就会被隐藏,然后它会调用一个函数。现在我有:

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if(textField == _currentPasswordField)
    {
        [textField resignFirstResponder];
        [_passwordField becomeFirstResponder];
        return YES;
    }
    else if (textField == _passwordField)
    {
        [textField resignFirstResponder];
        [_confirmPasswordField becomeFirstResponder];
        return YES;
    }
    else
    {
        [textField resignFirstResponder];
        [self changePassword];
        return YES;
    }
}

但是在整个 changePassword 函数返回后,键盘就被隐藏了。我怎样才能隐藏它然后调用我的函数?!

谢谢!

4

1 回答 1

0

问题是您的changePassword方法需要很长时间才能运行,因为它正在通过网络与服务器通信。

所有用户界面更新,例如键盘隐藏动画,都是从主线程触发的。当您在主线程上调用慢速方法时,您会阻止这些用户界面更新发生。

您需要将调用changePassword移出主线程。有很多方法可以做到这一点。最简单的方法之一是使用 Grand Central Dispatch (GCD),如下所示:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self changePassword];
});

但是,除非您的changePassword方法是线程安全的,否则这是不安全的,因此您需要考虑您在做什么changePassword以及它在后台线程上运行而其他方法在主线程上运行时会发生什么。

您需要阅读并发编程指南,或观看一些 WWDC 视频,例如 Session 211 - Simplifying iPhone App Development with Grand Central Dispatch from WWDC 2010

于 2012-11-21T19:58:18.503 回答