3

次のように、ペン先からコンテンツをロードするカスタム ビューを作成しました。

/* PricingDataView.h */

#import <UIKit/UIKIt.h>

@interface PricingDataView : UIView {
  UIView *contentView;
}
@property (nonatomic, retain) IBOutlet UIView *contentView;
@end

/* PricingDataView.m */

#import "PricingDataView.h"

@implementation PricingDataView
@synthesize contentView;

- (id)initWithFrame:(CGRect)frame {
  if ((self = [super initWithFrame:frame])) {
    [[NSBundle mainBundle] loadNibNamed:@"PricingDataView" owner:self options:nil];
    [contentView setFrame:frame];
    [self addSubview:contentView];
  }
  return self;
}

/* ... */

nibファイルにPricingDataViewFile's Ownerのタイプを設定し、contentViewIBにアウトレットを接続しました。UIViewユーザーに表示されるフルサイズのビューに Interface Library からレギュラーを配置し、そのクラス名を に変更しましたPricingDataView。それはすべてビルドされますが、実行時に、カスタム ビューがあるはずの場所に何もレンダリングされません。

にブレークポイントを配置しましPricingDataView.initWithFrameたが、ヒットしないため、ビューが初期化される原因となるものが不足していることがわかります。私が興味を持っているのは、ペン先から他のビューをロードする過程で、すべての初期化が発生するが、このビューでは発生しないことです。なんで?

4

3 に答える 3

10

他のビューが を使用していないことを確認しますUIViewControllerか? from のドキュメントinitWithFrame:からの引用は次のUIViewとおりです。

Interface Builder を使用してインターフェイスを設計する場合、ビュー オブジェクトが後で nib ファイルから読み込まれるときに、このメソッドは呼び出されません。nib ファイル内のオブジェクトは、再構成された後、initWithCoder: メソッドを使用して初期化されます。このメソッドは、ビューの属性を nib ファイルに保存されている属性と一致するように変更します。nib ファイルからビューをロードする方法の詳細については、Resource Programming Guideを参照してください。

于 2010-05-04T22:18:18.363 に答える
1

PricingDataView追加するビューのクラス名 ( ) を元に戻すだけですUIView。この場合、initWithFrame: メソッドが呼び出されます。

以前awakeFromNibはループで呼び出されました。as yourcustomViewViewyou が追加する via Nibas asubViewは同じクラス タイプです。

于 2012-04-05T06:34:20.167 に答える
1

実行時に Interface Builder にファイルを追加する -(id)initWithCoder:(NSCoder *)aDecoder と、initWithFrame ではなく が呼び出されます。

于 2011-01-04T12:37:39.560 に答える