NSObject UIKit Additions Referenceによると、アウトレット変数は、awakeFromNib
呼び出されるまでに設定する必要があります (すべて私のものを強調してください)。
nib 読み込みインフラストラクチャは、アーカイブ内のすべてのオブジェクトが読み込まれて初期化された後にのみ、nib アーカイブから再作成された各オブジェクトに awakeFromNib メッセージを送信します。オブジェクトが awakeFromNib メッセージを受信すると、すべてのアウトレットとアクション接続がすでに確立されていることが保証されます。
...
重要: オブジェクトがアーカイブからインスタンス化される順序は保証されていないため、初期化メソッドは階層内の他のオブジェクトにメッセージを送信しないでください。他のオブジェクトへのメッセージは、awakeFromNib メソッド内から安全に送信できます。
通常、設計時に実行できない追加の設定が必要なオブジェクトに対しては、awakeFromNib を実装します。たとえば、このメソッドを使用して、任意のコントロールの既定の構成をカスタマイズして、ユーザー設定や他のコントロールの値に一致させることができます。また、個々のコントロールをアプリケーションの以前の状態に復元するために使用することもできます。
ただし、少なくともストーリーボードを使用した場合、これは私のテストと一致しません。次のテストの結果は、ドキュメントと矛盾しているようです。
- Xcode で新しいシングル ビュー アプリケーションを作成します。
- 2 つ目の ViewController をストーリーボードにドラッグします。
- 最初の ViewController にボタンを与え、そのボタンから 2 番目の ViewController を表示するモーダル セグエを作成します。
- 2 番目の ViewController の ViewController クラス ファイルを作成します。
- ストーリーボードの 2 番目の ViewController にラベルを作成し、
someLabel
そこから対応する ViewController クラスに呼び出されるアウトレットを作成します。 awakeFromNib
次の実装を 2 番目の ViewController に追加します。
.
- (void) awakeFromNib {
[super awakeFromNib];
if (self.someLabel == nil) {
NSLog(@"someLabel property is nil");
}
else {
NSLog(@"someLabel property is not nil");
}
if (_someLabel == nil) {
NSLog(@"_someLabel is nil");
}
else {
NSLog(@"_someLabel is not nil");
}
}
- シミュレーターでアプリを実行し、ボタンをクリックします。
これを行うと、次のログが記録されます。
2013-07-01 09:24:35.755 test[498:c07] someLabel property is nil
2013-07-01 09:24:35.758 test[498:c07] _someLabel is nil
この動作の結果として、ViewController にアウトレットを含む初期化ロジックが必要な場合は、アウトレットを使用できるようにするために、ここでの回答で提案されているようなハックを使用する必要があります。ドキュメントを正しく理解していれば、このハックを使用せざるを得ないという事実はUIKitの動作のバグであり、その初期化を入れて、ハックなしでアウトレットを簡単に使用できるはずです。awakeFromNib
ただし、インターネット上でこの問題について他の言及を見つけることはできません. また、実際のnibファイルを使用したことはなく、ストーリーボードのみを使用したため、これについての視点が欠けています。このようなドキュメントは冗長で難しく、iOSの初心者として、理解したと確信できません.正しく。これは本物の UIKit のバグですか、それともドキュメントを何らかの形で誤解していますか? おそらく、この方法はストーリーボードと組み合わせて使用することを意図していませんか?