Создание подкласса UIView с делегатом с использованием файла NIB - PullRequest
6 голосов
/ 28 февраля 2011

У меня есть подкласс UIView, который я хотел бы создать из файла NIB.Я использовал этот метод, чтобы сделать это:

UINib *nib = [UINib nibWithNibName:@"SSNodeToolsView" bundle:[NSBundle mainBundle]];
self = [[[nib instantiateWithOwner:self options:nil] objectAtIndex:0] retain];

... и действительно, это создает объект правильно и связывает все.Однако объект мгновенно теряет доступ к своему делегату.Делегат объявляется обычным образом:

id delegate
@property (nonatomic, assign) id delegate
@synthesize delegate

... и так далее.Однако, когда объект загружается из его кончика, делегат мгновенно становится нулевым и игнорирует любую попытку присвоить ему значения.Как ни странно, это не вызывает сбой.Может кто-нибудь сказать мне, почему это?Я бы предпочел использовать метод загрузки пера, так как эти элементы моего приложения, вероятно, будут изменяться довольно часто, и было бы проще сделать это с помощью пера.

1 Ответ

7 голосов
/ 28 февраля 2011

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

Является ли объект делегата также в кончике? Если ничто не удерживает его (ваша собственность 'назначается'), оно может просто исчезнуть при следующем сливе из пула автоматического выпуска. Является ли делегат розеткой в ​​вашем кончике? «nil» значения в розетках после загрузки пера обычно являются признаком того, что розетки подключены неправильно. Кроме того, кажется, что вы создаете перо с помощью объекта-владельца (self), который еще не инициализирован? Если это так, ваши розетки могут быть подключены неправильно, потому что розетки связаны только в том случае, если соответствующее значение в объекте владельца равно нулю. Вы должны иметь полностью инициализированный объект владельца, прежде чем использовать его в качестве владельца при загрузке пера.

Вот код инициализации «загрузить этот объект из пера», который я использую в одном из моих проектов:

- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        // Initialization code.
        //
        [[NSBundle mainBundle] loadNibNamed:@"ScoreView" owner:self options:nil];
        [self addSubview:self.view];
    }
    return self;
}

- (void) awakeFromNib
{
    [super awakeFromNib];

    [[NSBundle mainBundle] loadNibNamed:@"ScoreView" owner:self options:nil];
    [self addSubview:self.view];
}

Использование перьев имеет встроенный уровень косвенности, которого вы не можете избежать. Вы не можете создать объект и одновременно использовать его как владельца файла - владелец должен уже существовать и быть инициализирован (с нулевыми выходами) во время загрузки пера.

Используя приведенный выше код, я могу создать свой объект из кода или поместить его непосредственно в другие файлы пера - повторно используемый компонент UIView.

...