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メインスレッドから呼び出しを移動する必要があります。これを行うには多くの方法があります。最も簡単な方法の 1 つは、次のように Grand Central Dispatch (GCD) を使用することです。

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

ただし、メソッドがスレッドセーフでない限り、これは安全ではないため、他のメソッドがメイン スレッドで実行されている間にバックグラウンド スレッドで実行されている場合に、自分が何をしているのか、何が起こるかchangePasswordを考える必要があります。changePassword

Concurrency Programming Guideを読むか、Session 211 - Simplifying iPhone App Development with Grand Central Dispatch from WWDC 2010のような WWDC ビデオをいくつか見る必要があります。

于 2012-11-21T19:58:18.503 に答える