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 に答える