2

この警告についての助けを求める別の叫び。

まず第一に、私はここにあるすべての質問を他の場所で調べましたが、私の状況に合うものはないようです. アラート ボックスやファーストレスポンダーとしての辞任、ビューが表示される前のアニメーションの実行とは関係ありません。UIView ベースのカスタム キーボードをインスタンス化するときに問題が発生します。

第二に、私は警告を自由に表示/非表示にできると信じています。理由について非常に混乱しているので、解決策よりも説明を探しています。

ここに投稿するにはコードが多すぎるため、何が起こっているかの概要を説明します。

ViewController "Calc" は、VC の loadView メソッドでカスタム UIView ベースの "DataView" をインスタンス化し、それを VC のサブ ビューとして追加します。

「DataView」は、DataView の init メソッドでカスタム UITextField ベースの「TextFieldKPD」をインスタンス化します。

「TextField」は、TextField の init メソッドでカスタム UIView ベースの「KeyPad」をインスタンス化し、その KeyPad を TextField の inputView に割り当てます。

「KeyPad」は、タイプ UIButtonTypeCustom の 13 個の UIButton を作成し、各ボタンの「押された」および「押されていない」イメージを読み取って割り当て、ボタンのアクションを設定します。次に、各ボタンをそれ自体のサブビューとして追加します。(キーパッドの UIView ライフサイクルでこの構築がいつ発生するかを制御することで、wait_fences 警告を発生させることができます。以下を参照してください。)

「Calc」ViewController は、最初にユーザーに提示されるものです。私は、Calc の viewDidLayoutSubViews メソッドの終了後、その viewDidAppear メソッドが呼び出される前に発生する wait_fences 警告を追跡しました。Calc が表示されている場合、KeyPad は表示されないことに注意してください。

キーパッドの構成方法を変更することで、wait_fences 警告のアクションを制御できるようです。

  • UIButton がインスタンス化され、KeyPad の init メソッドでサブビューとして追加された場合、一度だけ警告が表示されます。

  • 代わりに、ボタンがインスタンス化され、KeyPad の layoutSubViews メソッドに追加された場合、警告は表示されません。(ただし、TextField をタップするまで KeyPad は効果的に構築されません - それでも、wait_fences 警告は表示されません)

Calc の loadView にはアニメーションも何もありません。それはインスタンス化され、ずっと下に割り当てられます。

このバージョンの wait_fences に関するコメントはありますか?

編集 1、1 月 30 日 - 今、さらに混乱しています!

今朝は退屈だったので、コードをいじって、警告の生成をより適切に分離できるかどうかを確認することにしました。警告をトリガーできる、まったく役に立たない次のコードに絞り込みました。

-(void)loadImages
{
    UIImage* image;

    for(int i=0; i<16; i++) {
        image = [UIImage imageNamed:@"StupidFileNameThatDoesNotExist"];
    }
}

[self loadImages]その後のinitメソッドで実行するとKeyPad、警告が表示されます。ただし、ファイルが存在しないため、このコードは何もしません。ループ カウンターが十分に小さければ警告は消えると思いますが、下限を限定していません。

画像の実際の読み込みを

[UIImage imageWithContentsOfFile:@"StupidFileNameThatDoesNotExist"]

初期化中にメソッドを呼び出してもKeyPad、警告が表示されないようです。画像をロードするこれら 2 つの方法の明らかな違いの 1 つはimageNamed、画像を内部的にキャッシュすることです。

だから私はそれが内部のアップルの失敗であるというジョージの答えに傾いています。

編集 2、2 月 1 日 - ジムへの警告ですが、私たちが知っているようなものではありません

そのため、明らかに問題を引き起こしているのは UIImage クラスのキャッシュであると確信しました。それについて何をすべきか?もちろん、私自身の画像キャッシュを書いてください!!

そこで、プラグインを開始し、無効な画像を読み込もうとしたコードを取り除き、必要なファイル名を生成してキャッシュ コントローラーに渡しました。そこで、物事がまとまり始めていることを確認するために、キャッシュ コントローラー内で、画像をキャッシュしようとするたびに NSLog メッセージを生成しました。

そして、何を推測しますか-愚かな警告が再び表示されます。実際の作業をまったく行わないため。

の init メソッドに余分なコードを詰め込むと、ある種の内部 iOS 競合状態がトリガーされるとしか結論付けられませんKeyPad。そして、それを軽減するために私にできることは何もないということです。私にできることは、この警告が無害であることを願うことだけです。

編集 3、ハムレット第 1 幕第 4 場: デンマーク州で何かが腐っている

編集 2 と同じコードを維持して、NSLog ステートメントをコメントアウトしました。そして、警告は消えました。元に戻すと、警告が表示されます。

だから私が持っているコードは次のとおりです。

-(void)loadImages
{
    // Iterate over button definitions and cache the required images
    for(int i=0; i<numKeys; i++) {

        if (![imageCache imageExistsForTag:keyTags[i]]) {
            [imageCache addImageFile:[NSString stringWithFormat:@"%s_NP.png",keyNames[i]] forTag:keyTags[i]];
        }

        if (![imageCache imageExistsForTag:keyTags[i]+pressedOffset]) {
            [imageCache addImageFile:[NSString stringWithFormat:@"%s_P.png",keyNames[i]] forTag:keyTags[i]+pressedOffset];
        }

    }

}

と:

-(void)addImageFile:(NSString*)imageFile forTag:(int)tag
{
    NSLog(@"Adding tag:%d for file %@", tag, imageFile);
}

その NSLog ステートメントを使用して、警告の表示を制御します。

編集 4、2 月 2 日 - 運命の神殿へようこそ

Allen のコメントを真摯に受け止め、手動でビューを構築しようとする代わりに、キーボードを XIB として再構築し、それをロードしました。もちろん、それは何も修正しませんでした。私は、Nib の読み込みが問題の原因以外で起こることを望んでいました。

私の直感では、Calc の loadView と iOS の内部アクティビティ内で競合状態に直面しているということです。loadView 内で作業をしすぎると、一線を越えて wait_fences 警告が発生します。また、キーボードは症状であり、根本的な原因ではありません。IE、それはどんな活動でもあった可能性があります.警告が表示される前にキーボード操作が最後に行われただけです. 私が実際に交差していて、暗闇の中でつまずかないという制約が何であるかを実際に知っていればよかったのにと思います。

4

5 に答える 5

2

コードの説明について私が知る限り、親/スーパービューの前にサブビュー (例: UIAlertView) が作成されたときに問題が発生するようです。レスポンダーチェーンと関係があります。

ビューコードを移動して問題を修正するか、関連する部分を貼り付けてみてください。

于 2012-01-28T16:43:57.133 に答える
2

以前にこの問題が数回発生し、解決策を見つけようとしました。私が得た最も近いものは、アップルのエンジニアによると、これは内部で発生した問題であり、サードパーティの開発者が心配する必要はないというものでした. 私の知る限り、すべての開発者を怒らせているように見えるデバッガーの本当に厄介なエラーを除いて、アプリがクラッシュしたり、問題が発生したりすることはありません!

これ以上お役に立てず申し訳ありません。

于 2012-01-28T16:28:47.490 に答える
0

私の知識によると。この警告は、UIAlertView を呼び出しているときに表示され、同時に UIView で何らかの操作を実行しています。この問題を解決するには、その時点で UIView で操作を実行する必要はありません。このために、次の 2 つのいずれかを行うことができます。 1. UIView での操作が完了するように、少し遅れて UIAlertView を呼び出すことができます。2. または、メソッドで UIView の操作を実行することもできます - (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; そのため、UIView でいくつかの操作が実行されているときに、UIAlertView が UIView に表示されないようにします。

それがあなたを助けることを願っています。

于 2012-02-02T11:37:07.370 に答える
0

バックグラウンド スレッドから UIKit コードを誤って実行すると、wait_fences エラーが発生しました。それはあなたの問題ではないように思えますが、まだそうでない場合は、別のことを調べてください。

于 2012-02-01T19:48:51.583 に答える
0

? ビュー/ビューコントローラーの階層が少しわかりません...

「マスター」ビューの「DataView」を作成するViewController「Calc」があります。「DataView」は、テキストフィールド「TextFieldKPD」をそれ自体のサブビューとして作成します。次に、"TextFieldKPD" は UIView "KeyPad" サブビューを作成し、それ自体が 13 個の UIButton サブビューを作成します。

あなたのビューは 4 レベルの深さですか?

Apple は、ViewController が画面全体のビューを処理する必要があると述べています (containerView を作成できるようになったため、これは少し変更されたと思いますが、そのアサーションの背後にある意図は残っています)。キーパッド ボタン イベントとテキストフィールド イベントが viewController によって処理されることを確認してください。

これらすべてのビューを viewController またはマスター ビューで作成して、階層をよりフラットにした方がよいのではないでしょうか?

階層を誤解していた場合はお詫び申し上げます。

ところで、試みるべきことの1つは、テキストフィールドを完全に削除して、まだエラーが発生するかどうかを確認することです.

于 2012-02-02T14:40:41.127 に答える