尝试从界面生成器加载笔尖

Trying to load a nib from interface builder

我有一个基于 UIView 的 class,它有自己的 XIB。让我们称之为 class MyClass。所以我有 MyClass.xibMyClass.hMyClass.m.

我在故事板上有一个 UIView 对象,我将该对象的 class 设置为 MyClass

我创建了一个新的 UIView XIB,在 XIB 中,我将文件所有者的 class 更改为 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 内部建立的更多连接?

使用 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;
}

让我们像下面一样

例如在 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];
}

我已经尝试了所有答案,但这是经过多次试验后唯一有效的代码:

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

  if (self.view == nil) {
    NSBundle *mainBundle = [NSBundle mainBundle];
    [mainBundle loadNibNamed:@"MonthDayPicker" owner:self options:nil];

    [self addSubview:self.view];
    return self;

  }

  return nil;
}