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.

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

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

Любые идеи?


person Duck    schedule 05.09.2017    source источник
comment
Что вы имеете в виду, назначив его первому ответчику XIB? Вы не можете ничего назначить Первому ответчику, это прокси-элемент, который представляет динамическое значение первого ответчика.   -  person Lily Ballard    schedule 06.09.2017
comment
что ты имеешь в виду? так рассказывают все учебники в сети.   -  person Duck    schedule 06.09.2017
comment
Вы имеете в виду, что назначили его владельцу файла?   -  person Lily Ballard    schedule 06.09.2017
comment
ах, извините, я имею в виду владельца файла...   -  person Duck    schedule 06.09.2017
comment
Тесно связанный (на самом деле та же причина): >-awakeFromNib для владельца файла   -  person jscs    schedule 06.09.2017
comment
Владелец файла на самом деле не находится в архиве, это просто заполнитель.   -  person jscs    schedule 06.09.2017
comment
так какое решение для этого? Пожалуйста, сделайте это ответом, чтобы я мог принять и дать вам очки и славу ... ????   -  person Duck    schedule 06.09.2017
comment
Добавьте экземпляр представления в перо и разархивируйте перо обычным способом, а не записывайте его вручную.   -  person jscs    schedule 06.09.2017
comment
это клингон для меня   -  person Duck    schedule 06.09.2017


Ответы (1)


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

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

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

person jscs    schedule 05.09.2017