【问题标题】:InitWithCoder never called for Cocoa NSView based classInitWithCoder 从未调用基于 Cocoa NSView 的类
【发布时间】:2018-02-14 06:15:00
【问题描述】:

我创建了一个XIB

我创建了这个名为MyCustomView 的类并将其分配给XIB 的文件所有者。

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

- (instancetype)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  if (self) [self load];
  return self;
}

- (void)load {

  NSArray* topLevelObjects;
  [[NSBundle mainBundle] loadNibNamed:@"MyCustomView"
                                owner:self
                      topLevelObjects:&topLevelObjects];

  NSView* view;
  for (id aView in topLevelObjects) {
    if ([umaVista isKindOfClass:[NSView class]]) {
      view = umaVista;
      break;
    }
  }

  [self addSubview:view];
  view.frame = self.bounds;  

}

我在主应用上创建了一个NSView

我将该视图更改为MyCustomView

我运行应用程序。 MyCustomViewinitWithCoder 不运行。 initWithFrame 不运行。 awakeFromNib 不运行。

什么都没有发生。

有什么想法吗?

【问题讨论】:

  • “将其分配给XIB 的第一响应者”是什么意思?您不能将任何内容“分配”给 First Responder,这是一个代表动态 First Responder 值的代理项。
  • 什么意思?这就是网络上所有教程的说明。
  • 你的意思是你把它分配给“文件的所有者”吗?
  • 啊,对不起,我是说文件所有者...
  • 密切相关(同样的原因,真的):-awakeFromNib for File's Owner

标签: macos cocoa nsview initwithcoder initwithframe


【解决方案1】:

“文件的所有者”as I've written elsewhere,不是存档中的真实对象。这是一个占位符。当您打开 nib 包装时,会使用一个预先存在的对象。

看起来您应该只是将自定义视图的一个实例放入笔尖。不要让它成为文件的所有者,只需从对象调色板中拖出一个视图,然后在身份检查器中更改其类(右窗格,顶部;按 ⌘-⌥-3)。也可以在 nib 中构建子视图。

然后让您的NSBundle 为您加载笔尖。您的自定义视图将获得initWithCoder:awakeFromNib,并且您不必通过层次结构来查找特定的子视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多