しばらくの間、問題なくテーブルにカスタム セル (独自のペン先を持つ) を使用してきました。新しいプロジェクトでは、タイトル、ボタン、およびより多くのビューを保持するための別の UIVIew を持つ再利用可能なカスタム ビュー (セルではない) が必要であることがわかりました。私はそれを「セクション」と呼びます:
アイデアは、ストーリーボードでこのセクションを使用できるようにすることです (UIView を使用し、それに応じてカスタム クラスを設定します)。そうすれば、その UIView 内に配置したビューは、実際にはセクションの内部 UIView に含まれます。
難しいのは、セクションのルート UIView ではなく、IB と Storyboard を使用して配置されたビューを実際にその内部 UIView に実際に配置することだと思いました。カスタムビューを作成するだけでは(内部ビューはまだありません)、期待どおりに機能しないことがわかりました。これは、私が行って作業した数十のカスタム セルに基づいたコードです (ただし、一般的な UIView の特定の init メソッド用に調整されています)。
#import "SectionContainer.h"
@implementation SectionContainer
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SectionContainer" owner:self options:nil];
self = [nibArray objectAtIndex:0];
/*NSArray *nibRoot = [[UINib nibWithNibName:@"SectionContainer" bundle:nil] instantiateWithOwner:self options:nil];
[self addSubview:[nibRoot objectAtIndex:0]];*/
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code
NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SectionContainer" owner:self options:nil];
self = [nibArray objectAtIndex:0];
/*NSArray *nibRoot = [[UINib nibWithNibName:@"SectionContainer" bundle:nil] instantiateWithOwner:self options:nil];
[self addSubview:[nibRoot objectAtIndex:0]];*/
}
return self;
}
一致する XIB のルート ビューは、このカスタム クラスに設定されています (カスタム セルで行うのと同じように)。
問題
このカスタム クラスによって EXC_BAD_ACCESS code=2 が発生し、ステップ実行してわかることから、クラスが再帰的に呼び出されているようです。EXC_BAD_ACCESS エラーが発生するまで、initWithDecoder への呼び出しに次ぐ呼び出しが行われます。
私が試したこと
- 再帰呼び出しのように見えるので、XIB のルート ビューではなく、カスタム クラスに XIB のファイル所有者を設定する別のアプローチを試してみました。これにより、次のエラーが発生しました。
'NSUnknownKeyException'、理由: '[ setValue:forUndefinedKey:]: このクラスは、キー sectionContainerView のキー値コーディングに準拠していません
- XIB のルートがカスタム クラス (addSubView) に設定されるのではなく、カスタム クラスに追加される (上記のコードでコメント アウトされている) わずかに異なる方法を試しました。これは何も変更しませんでした。同じ再帰呼び出し (または、設定されている場合は上記のエラー)
これについてのガイダンスを本当に感謝します。ありがとうございました。