2

次のワークフローがあります。

Input in Textfield -> (Return key of TextField pressed: resignFirstResponder, IBAction of Button called) -> IBAction of Button: perform an intensive operation

問題は、キーボードが で閉じられる前に、集中的な操作が開始されることresignFirstResponderです。提案された他の投稿 (例: https://stackoverflow.com/a/3452767/1685971 ) のように、私は使用しようとしました:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    [self performSelector:@selector(ibActionMethod:) withObject:sender afterDelay:someTime];
    return YES;
}

これは、シミュレーターまたは iPhone 4 では問題なく動作しますが、iPhone 5 で実行するとクラッシュします (使用しなかったため、理解できませんperformSelectorInBackground:withObject:)。

void _WebThreadLockFromAnyThread(bool): Obtaining the web lock from a thread other than the main thread or the web thread. UIKit should not be called from a secondary thread.
bool _WebTryThreadLock(bool): Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...

私が試したもう1つのオプションは、メインスレッドでresignFirstResponderを待つことです

[textField performSelectorOnMainThread:@selector(resignFirstResponder) withObject:nil waitUntilDone:YES];

しかし、これでもキーボードはすぐに閉じられません (おそらく、メソッドがセレクターの戻りのみを待機しresignFirstResponder、キーボード アニメーションの終了を待機しないためです。

これに対する解決策はありますか?

4

2 に答える 2

2

これを試して

dispatch_async(dispatch_get_main_queue(), ^{
    // your button action
});

私も同じエラーに直面していましたが、上記のトリックで解決しました。

于 2013-02-19T09:36:55.993 に答える
0

このコードを試して、

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

       [textField resignFirstResponder];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //your code here

        });

       return YES;

}

于 2013-02-19T08:51:16.567 に答える