3

しばらくの間、問題なくテーブルにカスタム セル (独自のペン先を持つ) を使用してきました。新しいプロジェクトでは、タイトル、ボタン、およびより多くのビューを保持するための別の 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) に設定されるのではなく、カスタム クラスに追加される (上記のコードでコメント アウトされている) わずかに異なる方法を試しました。これは何も変更しませんでした。同じ再帰呼び出し (または、設定されている場合は上記のエラー)

これについてのガイダンスを本当に感謝します。ありがとうございました。

4

2 に答える 2

0

ストーリーボードで呼び出されるコンポーネントを使用する必要がありますCustom Container View。ストーリーボードにいくつかの構成が含まれており、コードはビュー/VC の配管方法に依存するため、ここにコードを投稿することはできませんが、関連するガイドをここで読むことができます:

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

于 2014-06-07T05:28:39.517 に答える
0

まず、再帰呼び出しは initWithCoder: で行われます。nib をロードするということは、initWithCoder: を通じてそのビューを開始することを意味します。

そのため、ペン先でこのように設計した UIView サブクラスを使用することはできません (ビューのクラスをストーリーボードまたは実際に別のペン先に設定することによって)。

これを使用する唯一の方法は、コードで nib を介してインスタンス化することです。

Section *sectionView = [[[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:options] objectAtIndex:index];

さて、あなたが作ったペン先から物事を配線することで、あなたのペン先のオブジェクトから、ペン先には見られない別のオブジェクトへの接続を作ることができます. それがファイル所有者の目的です。その(ファイル所有者の)クラスを設定し、それに接続し、接続を実現したいクラスのインスタンスを、nibをロードするときの所有者パラメーターとして使用する必要があります。

しかし、これはあなたが望んでいたものではないと思います。ペン先のルートビューであると想定する「セクション」からペン先のサブビューにアクセスできるようにしたかったと思います。Section クラスで IBOutlet (または IBAction、IBOutletCollection) プロパティを作成します。これらをペン先の残りのオブジェクトと結び付けるには、ペン先の「セクション」ビューでクリックを制御します。そこから何をすべきかがわかります。

于 2014-06-13T17:06:37.727 に答える