initWithFrame не вызывается, но awakeFromNib - PullRequest
28 голосов
/ 11 января 2009

Я пытаюсь создать подкласс NSOutlineView. Вот мой код:

OutlineViewSublcass.h:

#import <Cocoa/Cocoa.h>

@interface OutlineViewSubclass : NSOutlineView {

}

@end

OutlineViewSubclass.m:

#import "OutlineViewSubclass.h"

@implementation OutlineViewSubclass

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    printf("debug A\n");
    return self;
}

- (void)awakeFromNib
{
    printf("debug B\n");
}

@end

Вывод отладки:

debug B

Почему не звонят (id)initWithFrame:(NSRect)frame?

Ответы [ 2 ]

50 голосов
/ 11 января 2009

Элементы управления Какао реализуют протокол NSCoding для разархивирования с пера. Вместо инициализации объекта с помощью initWithFrame: и затем установки атрибутов, initWithCoder: метод берет на себя ответственность за настройку элемента управления при его загрузке с использованием сериализованных атрибутов, настроенных Interface Builder. Это работает почти так же, как любой объект сериализуется с использованием NSCoding.

Немного иначе, если вы вставляете пользовательский подкласс NSView в перо, которое не реализует NSCoding, в этом случае будет вызываться initWithFrame :. В обоих случаях awakeFromNib будет вызываться после загрузки объекта и, как правило, является довольно хорошим местом для выполнения дополнительной инициализации в ваших подклассах.

18 голосов
/ 09 декабря 2009

Официальный ответ Apple на это Создание пользовательского представления .

Просмотр экземпляров, созданных в Интерфейсном Разработчике , не вызывайте initWithFrame: когда их nib-файлы загружаются , что часто вызывает путаницу Помните, что Interface Builder архивирует объект при сохранении файла пера, поэтому экземпляр представления уже будет создан, а initWithFrame: уже будет вызван.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...