0

UIView独自の XIB を持つベース クラスがあります。このクラスを呼び出しましょうMyClass。だから私はMyClass.xibMyClass.hそしてを持っていMyClass.mます。

ストーリーボードに UIView オブジェクトがあり、そのオブジェクトのクラスを に設定しましたMyClass

新しいUIViewXIB を作成し、XIB 内でファイル所有者のクラスを に変更しましたMyClass。XIB 内でさらに接続を行う必要があるかどうかはわかりません。

私が欲しいのはこれです:ストーリーボードが読み込まMyClass.mれ、それが読み込まれますMyClass.xib。そのため、この初期化コードがあります:

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        NSString *className = NSStringFromClass([self class]);
        self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
        [self addSubview:self.view];
        return self;
    }
    return nil;
}

問題は、このコードが無限ループに入ることです。もう一度loadNibNamed電話をかけるinitWithCoder:と、アプリがクラッシュします。

それ、どうやったら出来るの?なぜループなのか、xib 内で作成する必要がある接続は他にありますか?

4

3 に答える 3

1

以下のようにしましょう

awakeFromNibたとえば、メソッドで開始します

MyClass.mファイル内

- (instancetype)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if(self)
  {
      //set up hear
  }
  return  self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
  self =   [super initWithCoder:aDecoder];
  if(self)
  {

  }
  return self;
}


- (void)awakeFromNib
{
   [super awakeFromNib];
   //set up hear
   NSString *className = NSStringFromClass([self class]);
   UIView *view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
  [self addSubview:view];
}
于 2015-06-08T05:58:41.983 に答える
0

を使用self.subviews.count == 0すると、次のようにループが中断されます。

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self && self.subviews.count == 0) {
        NSString *className = NSStringFromClass([self class]);
        self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
        [self addSubview:self.view];
    }
    return self;
}
于 2015-06-08T01:57:13.867 に答える