0

我有一个UIView基础类,它有自己的 XIB。让我们调用这个类MyClass。所以我有MyClass.xib和。MyClass.hMyClass.m

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

我创建了一个新UIView的 XIB,在 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 回答
0

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

- (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;
}
于 2015-06-08T06:29:19.143 回答