この警告についての助けを求める別の叫び。
まず第一に、私はここにあるすべての質問を他の場所で調べましたが、私の状況に合うものはないようです. アラート ボックスやファーストレスポンダーとしての辞任、ビューが表示される前のアニメーションの実行とは関係ありません。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、それはどんな活動でもあった可能性があります.警告が表示される前にキーボード操作が最後に行われただけです. 私が実際に交差していて、暗闇の中でつまずかないという制約が何であるかを実際に知っていればよかったのにと思います。