次のワークフローがあります。
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
、キーボード アニメーションの終了を待機しないためです。
これに対する解決策はありますか?