2012-02-24 8 views
1

私は、それぞれが答えを持っているが、組み合わせられていないという問題が非常に多い。 Xibsを2つ読み込んでいます。ヤンのおかげでawakeAfterUsingCoder:(NSCoder *)aD {}を使用しており、カスタムビューの初期読み込みを得ることができます(カスタムビューを含むスクロールビューが内部にあります)。Xibから2つのXibsが読み込まれていて、列挙されて間違ったタイプの間に突然変異が起こった

次に、[NSBundle] ... loadNibNamed:@ "Name"] objectAtIndex:0]を使用する内部ビューをロードして、Xibからプログラムでロードします。

これまでのところ、コードでXib、XibでXib(AwakeAfter以外に余分なコードはありません)を読み込んでいます。さて、私はscrollViewにミニビューを追加するために、loadNib ... options ...を使って追加します。エラーコード...が突然変異しました。列挙されている間。

何が?だから私は明らかに私の配列を変更しています(最初は、追加したときにスクロールビューのサブビューを列挙していると思っていましたが、そうではありません...私はそんなに不注意ではありません)。まあ、それは同時性ですか?いいえ、私はまっすぐループしていて、代議員に「こんにちは、私はデータを変更しました、そして現在はサブビューに追加する」と言っています。しかしそれはそうではありません、正直なところ...あなたはこれを愛するでしょう: 私は私の意見をそのように名づけたとしましょう。 BigScrollView(内側のビューを保持)し、次にこれを... InnerView * iv;

次に、このようなことをします。InnerView * temp = [[[NSBundle mainBundle] loadNibNamed:@ "InnerView" owner:self options:nil] objectAtIndex:0];時にはそれを型キャストすることさえできます。それから、クラッシュする前に、私は NSLog(@ "クラス:%@"、NSStringFromClass([temp class]); プリントは何ですか? BigScrollView。デバッグしてPO ObjectNameを使用することさえできます。

どうしますか?

さらに検索すると、「新しいNibをロードすると、Nibから読み込んだすべての単一ビューで毎回AwakeFromNibが呼び出されます。古いNibもすべて呼び出されます」という結果が得られました。 。まあ、それはちょっと変だけど...後で私はおそらくそのことを理解しています...

  • (id)awakeAfterUsingCoder:とも呼ばれます。つまり、InnerViewの読み込み呼び出しを使用すると、自動的にBigScrollViewが呼び出されます。awakeAfterUsingCoder:

これをNSLogsでさらに検査した後、私は正しくなりました。

私はこの行を押したので、 if(![self isKindOfClass:[BigScrollView class]])selfを返します。

新しいBigScrollViewを作成しないようにするだけです(実際のタイプは異なる、ちょうどfyi、私は本当にそれが何であるかカスタムが必要です)。

しかし、それは動作していません。

私は、速度とXibsカスタムを使用する能力の両方で、ネイティブiOSを使用することの主要な支持者です。あなたがWWDC 2010を見ていない限り、MKMapRectがどのように説明されていないか、UIScrollViewがその仕様に "should should"を持っているかのように、私は間違ったことをせずに、それらをよりよく理解し、ツールを使用する...私は軽い心でこれを言う:リンゴはどのように "int num"とフロートを受け取ることができるだけでなく、マルチスレッドの何かを聞いていないときに何かをするか?私が得られない一般的なプロセスはありますか?

Xibをxibでインスタンス化せずに、コードを両方とも呼び出し、手動で配置するだけで、それが動作するかどうかを確認することができます。しかし、私はSOの質問のこの化合物を見つけていないので、私はどんな答えにも開いています。

+0

私はちょうど私のコードではありませんに作り直していますawakeAfterCoderを使用してください。私は余分な "doLayout"のものを持っていましたが、並行性を使うものは何もありませんでした。それは決して壊れませんでしたが、単にInnerView * iv = ... loadNibNamed:@ "InnerView"]を入れてもそれを追加していないと、まだクラッシュしていました –

+0

スティーブンに感謝します。私の場合は、メインのxib内のNSTableViewによって自動的にロードされるカスタムNSCellを定義していました。カスタムセルは、ビューを含む別のxibをロードします。私はちょうど2番目の負荷で2秒の遅れを入れていました - それがもう一度やり直されるのを見てきました。 – Colin

答えて

1

awakeFromNibは、アクティブウィンドウ内のすべてのビューに対して、インスタンス化されるすべてのビューに対して1回呼び出されます。言い換えれば、2つの呼び出しを防ぐために静的変数を使用します。それでも、自分の初期化コードを書くことは、Appleのpremadeソリューションよりも優れていました。

また、あなたはそれが唯一のビューごとに一度と呼ばれることがわかっている場合は、この関数に初期化を突き出す、通常、これは動作しますが、注意してください。 - (無効)didMoveToSuperview {}またはウィンドウFUNC

関連する問題