InitWithCoder никогда не вызывался для класса, основанного на Cocoa NSView

Я создаю 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,

Я запускаю приложение. MyCustomView"s initWithCoder не работает. initWithFrame не работает. awakeFromNib не работает.

Ничего не произошло.

Есть идеи?

1 ответ

Решение

"Владелец файла", как я уже писал в другом месте, не является реальным объектом в архиве. Это заполнитель. Когда вы распаковываете перо, уже используется существующий объект.

Похоже, вы должны просто поместить экземпляр вашего собственного представления в перо. Не делайте его владельцем файла, просто перетащите вид из палитры объектов, а затем измените его класс в Identity Inspector (правая панель, вверху; нажмите ⌘-⌥-3). Создайте подпредставления в перо тоже.

Тогда получите ваш NSBundle загрузить перо для вас. Ваш пользовательский вид получит initWithCoder: а также awakeFromNibи вам не придется разбираться в иерархии, чтобы найти конкретное подпредставление.

Другие вопросы по тегам