「wait_fences:応答の受信に失敗しました:10004003」?


94

次のコード行が原因で、ビューが最初に(そして初めてだけ)この不可解なエラーを受け取ります。

- (void)viewWillAppear:(BOOL)animated
{
    [textField becomeFirstResponder];
}

これにより、アプリが応答しなくなったように感じるために、顕著な遅延(シミュレータでも約3〜4秒)が発生します。誰かがこれを修正する方法を知っていますか?Appleのサイト、またはここやGoogleで解決策に関するドキュメントが見つかりません。

奇妙なことに、私がの-viewDidAppear:代わりに行を入れると、反対の状況が起こり-viewWillAppear:ます。つまり、最初にキーボードが表示されたときにのみエラーを出力するのではなく、2回目以降にエラーを出力するのではなく、エラーは初回ではなく毎回出力されます。これは私にとって大きな頭痛の種です。

回答:


103

オーバーライド-viewDidAppear:ではなく-viewWillAppear、必ず呼び出してください[super viewDidAppear:]。画面上にないときはアニメーションを実行しないでください(「表示されます」)。そして、-viewDidAppear:ドキュメントsuperには、彼らがするべき独自の事柄があるので、あなたは電話しなければならないことを説明しています。


これは私が望むほど反応が良くありませんが(毎回キーボードを表示するのにまだ少し遅れがあります)、それでうまくいくようです。
マイケル

1
私はあなたが話している遅れを知っています。多くのアプリで見たことがあります。-[super viewDidAppear:]を呼び出す前に(後ではなく)、-becomeFirstResponderを呼び出してみてください。これによる影響はないかもしれませんが、アニメーションが次のループではなく同じイベントループで開始される可能性があります。これを確認するための実験はまだ行っていません。
Rob Napier

14
これは問題を解決しません。viewDidAppearでUIAlertSheetをスローした場合、[super viewDidAppear:animated]を呼び出した後、毎回同じメッセージが表示されます。しかし、後でそれを投げる場合、たとえばイバクションへの応答として言っても、問題ありません。したがって、performWithSelectorはおそらく修正する方法です。メッセージを無視することもできます。どちらにしても、これはSDKのバグであり、コードの問題ではないようです。
ビリーグレイ

9
@ビリー、アニメーションが完了する前にUIAlertSheetをスローすると、同じ問題が発生する可能性があります。いずれの場合も、viewDidAppear内にシートを配置するのはおそらく時期尚早であり、おそらくperformSelector:afterDelay:を使用してUIAlertSheetを次のループにプッシュする必要があります。詳細は十分に文書化されていませんが、これはSDKのバグではありません。-viewWillAppearでアニメーションを実行することは、元のコードのバグでした。どちらの場合も、メッセージを無視しないでください。奇妙な視覚的アーティファクト(アニメーションの奇妙な横方向のスライド)につながる可能性があります。
Rob Napier


22

すぐに同様のエラーが発生しました:

  1. モーダルビューを閉じる
  2. メインビューの更新
  3. 新しいモーダルビューの提示

デバイスではなく、シミュレータでのみ取得していることに気付きました。さらに、私は無限ループに巻き込まれていました。

私の解決策は、新しいモーダルビューの表示を遅らせることでした。ビュー階層をすばやく更新すると、Appleのコードで競合状態が発生したようです。

それを念頭に置いて、これを試してください:

     - (void)viewDidAppear:(BOOL)animated{

            [super viewDidAppear:animated];
            [textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
  }

画面に表示されていないUITextFieldのキーボードの表示に問題がある可能性があります。これは私のと同様の問題を引き起こしている可能性があります。

また、念のため、キーボードを提示する前に階層の更新時間を一時停止します。

お役に立てれば。


3
モーダルで発生していた問題について、新しいモーダルを表示する前に、モーダルが終了するのを待ちましたか?任意の時間待機して完了を期待するのではなく、modalViewControllerで-viewDidDisappearをオーバーライドすることで確認できます。これは、モーダルの-parentViewControllerにコールバックするか、通知を投稿できます。重要なのは、何かを却下するように依頼しても、それがなくなったことを意味するのではなく、一般的に物事を重ねてアニメーション化するべきではないことを理解することです。-viewWill / DidDisappearは、通常、状況がいつ発生するかを確実に知るための最良の方法です。
Rob Napier

最初のモーダルビューは写真ピッカーで、写真ピッカーのコールバックメソッド内のすべてを処理します。あなたの権利、viewDdiAppear内の次のモーダルビューを起動するコードを配置する必要があります。それはより良い解決策であり、プラットフォームに関係なく問題を修正する可能性が最も高いでしょう。
コーリーフロイド

12

メインスレッドのUIのみを操作していることを確認します。私が得たwait_fences: failed to receive reply: 10004003私は、関連するコードは、バックグラウンドスレッドで実行されたためUIAlertViewが約5秒間表示するために待っているそこに座っていた一方で。コードをブロックに入れてメインスレッドに送ることで確認できます:

dispatch_async(dispatch_get_main_queue(), ^{
    if (!success) {
        // Inform user that import failed
        UIAlertView * importFailedAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ErrorTitle5", @"Import failed") 
                                                                     message:NSLocalizedString(@"Error5", @"Something went wrong") 
                                                                    delegate:nil 
                                                           cancelButtonTitle:NSLocalizedString(@"OK", nil) 
                                                           otherButtonTitles:nil];
        [importFailedAlert show];
    }
});

9

私がGoogleで見つけたすべてを試してみましたが、どれも機能しませんでした。これが問題を解決したものです。重要なのは、willDismissWithButtonIndexデリゲートメソッドでこれを行うことです。他の場所でやる前に。

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
    [myTextField resignFirstResponder];
    [myTextField removeFromSuperview];  
    [myTextField release];  
}

8

viewDidLoadに次の行がある場合、このメッセージが表示される可能性があります。次の行をコメント化します。

[[UIApplication sharedApplication] setStatusBarHidden:YES]; //This line should be commented

(代わりに、アプリケーションのplistファイルからステータスバーを無効にすることができます)。


7

いくつかのテストの後、大きなルールは、「アニメーションによる解任またはアニメーションによるショーの前にアニメーションを実行しないこと」です。

例えば:

  • -dismissModalViewControllerAnimated:YESの委任コールバック後に呼び出しをしないでください(コールバックを使用してこれを行う前に、アラートビューがフェードアウトするのを待ちます)UIAlertView -alertView:willDismissWithButtonIndex:-alertView:didDismissWithButtonIndex:
  • becomeFirstResponderビューコントローラーが画面に表示される前にキーボード()を表示しないでください。

悪いことが起こるかもしれません。

役に立てれば幸いです;-)


私はclickedButtonAtIndexを使用しており、alertviewが閉じられる前に一連のテキストフィールドを生成していました。それをdidDismissWithButtonIndexに切り替えると、確かにそれらの警告を取り除くのに役立ちました!ありがとう!
Nitin Alabur

5

これにより、アニメーションや遅延なしに、キーボードがすぐに表示されるようになりました。

みましょうtextFieldのインスタンス変数もMyViewController(のサブクラスUIViewController)。

呼び出し[textField becomeFirstResponder]initWithNibName:bundle:(のサブクラスのためUIViewController)、またはinitWithStyle:(のサブクラスのためにUITableViewController、ないで)viewDidLoad。例えば:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [textField becomeFirstResponder];
    }
    return self;
}

または、初期化直後、ただしを押す前に呼び出しますUIViewController。例えば:

MyViewController *viewController = [[MyViewController alloc] init];
[viewController.textField becomeFirstResponder];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

面白い。これは常に機能しますか?私の懸念は、あなたが参照しないことですview。そのため、nibファイルがロードされているかどうかはわかりません。textFieldがIBOutletの場合、この時点ではそれはゼロになると思います。
Rob Napier

5

あなたがやった [textfield becomeFirstResponder];

そして、コードのテキストフィールドから値を取得したら、を実行します[textfield resignFirstResponder];。それはあなたを助けると思います。


4

現在のiPhone Simulator 4.0を実行している場合、アニメーションを1〜2秒遅らせて画面を回転すると(または画面を回転した後にアニメーション化すると)、このエラーメッセージが頻繁に表示されます。

これはシミュレータのこのバージョンのバグであり、間もなく修正される予定です。


iOS4シミュレータのバグに関する情報をありがとう。同じプロジェクトの場合、wait_fencesメッセージは3.1シミュレーターに表示されませんでした
ohho

3

詳細については、こちらを参照してください:http : //www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/17373-wait_fences-failed-receive-reply-10004003-a.html

あなたの問題は関連しています。


ヘルプに感謝しますが、残念ながらそのページで問題の解決策を見つけることができません。「サブビュー(UIAlertViewなど)が親/スーパービューの前に作成されると発生するようです。」これは上のコードでは起こらないはずですよね?
マイケル

3

オーバーライドviewDidappearではなくviewWillAppear

-(void) viewDidAppear:(BOOL) animated
{
 [super viewDidAppear:animated];
 [myTextField becomeFirstResponder];
}

3

このUIAlertViewコードを使用して、これを1対1でシミュレートできます。

   UIAlertView *alert = [[UIAlertView alloc]
                   initWithTitle:NSLocalizedString(@"defineTitle",@"defineTitle")
                         message:NSLocalizedString(@"defineBody", @"defineBody")
                        delegate:self
               cancelButtonTitle:NSLocalizedString(@"Ok", @"Ok")
               otherButtonTitles:nil];
   [alert show];

NSLocalizedStringがLocalizable.stringsファイルで定義されていない場合、テキストの検索に時間がかかるため、アラートが表示され、「wait_fences:応答の受信に失敗しました:10004003」が表示されます。

私にとっては、テキストをLocalizable.stringsファイルに追加するだけで問題は解決しました。たぶん、これは他の出来事にも当てはまりますか?


1

また、UIAlertView。私がそれを解決したのは、倉庫研究所が前述したように、以下のように辞任することでした。

- (void)didPresentAlertView:(UIAlertView *)alertView
{
    [txtListingPassword becomeFirstResponder];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [txtListingPassword resignFirstResponder];
}

UIAlertViewDelegateの他のデリゲートは問題を修正しませんでした。


1

問題は、Appleのコードに競合状態があることです。通常、これは誤ったUI更新に関係しています。

私の経験では、viewDidAppear、viewWillAppearなどでスーパーを呼び出していないか、viewDidLoadまたはviewWillAppearでUIAlertViewを表示しようとしています。

UIAlertViewを追加する場合、フレームワークは親ビューへの参照を必要とします。しかし、viewWillAppearまたはviewDidLoadを使用している場合、ビューは実際には表示されません...ビューをUIAlertViewで使用する準備が整っているviewDidAppearにコードを移動することを検討してください。


0

テキストフィールドはそのビュー内に含まれていますか、それとも他の何か内に含まれていますか?「becomeFirstRepsonder」は、そのビュー内に直接含まれているものにのみ送信できます。他のウィジェットコンポーネントに格納されている場合は、このウィジェットではなく、作成中のウィジェットでファーストレスポンダステータスを設定する必要があります。たとえば、テキストフィールドをアラートビューに追加する場合、ショーは非同期で発生するため、becomeFirstResponderを呼び出すまでに表示されない場合があります。(理想的には、独自のアラートビュークラスがあり、その中にテキストフィールドを定義します。そのビューがviewDidAppearを受け取るそのをファーストレスポンダーとして設定します。)


0

また、メッセージwait_fences: failed to receive reply: 10004003を受け取り、my viewWill...およびviewDid...メソッドはメッセージをに送信するだけsuperです。私の場合UIAlertView、私GameViewControllerに番組があり、ユーザーが代わりにiPhoneの円形のデバイスボタンを押してアプリに戻ったときに発生します。これは私の手から見えます。


0

アラートビューまたはアクションシートをメインスレッドに表示する必要があります...そのため、同期接続を作成して別のスレッドでその操作を実行し、その操作から受け取った出力に基づいてアラートを表示すると、次のエラーメッセージが表示されますwait_fences:failed to返信を受信:10004003。次のようなことができます...

[self performSelectotOnMainThread:@selector(handleOutput:) withObject:output waitUntilDone:YES/NO];

そして、出力応答文字列をパラメータとして渡して、handleOutputメソッドにアラートを表示します。


0

解決策はこちらです!

私は同じエラーがありました、今私は解決策を得ました、これはあなたを助けるかもしれません。

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
  [self performSelector:@selector(YOUR_METHOD) withObject:nil afterDelay:0.1];
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.