Загрузка пользовательского UIView из nib, все подпункты, содержащиеся в nib, равны нулю?

У меня есть собственный объект UIView с nib, который определяет макет представления/подсмотра. Мои выходы подключены, и когда я запускаю объект из initWithFrame:, все в порядке.

Проблема, с которой я столкнулась, - это когда я использую IB для вставки UIView в другой nib; появляется пользовательский UIView, но ни одно из представленных в нем представлений - на самом деле их символы все не равны нулю. У меня очень минимальная реализация initWithCoder: и awakeFromNib: (только ведение журнала), и я понимаю, что, поскольку дескриптор десериализован, subviews должны быть хотя бы инициализированы во время процесса?

Единственный вывод, который я прихожу сам по себе, состоит в том, что происходит одна из двух вещей: либо мои ссылки на выходные данные являются коррумпированными/плохими, а не работают, или мое понимание процесса загрузки-из-нибы Я что-то пропустил.

Спасибо заранее!

Изменить: (Код отправлен для Nekto в соответствии с запросом... как вы увидите, он регистрируется, и thats it, heh.)

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        NSLog(@"ThumbnailGridView.initWithCoder frame= %f, %f", self.frame.size.width, self.frame.size.height);
    }
    return self;
}

- (void)awakeFromNib
{
    NSLog(@"ThumbnailGridView:awakeFromNib");
}

Изменить 2: Nibs, контроллеры, subviews и т.д.

Nibs: У меня есть один наконечник, содержащий UIView. Этот UIView содержит единственный UIScrollView, который заполнен сеткой UIViews, которые определены в другом nib. (Примечание: эта часть работает нормально, так как заполнение выполняется программно и работает с вызовом initWithFrame:). Проблема здесь в том, что символ UIScrollView равен nil после initWithCoder: и awakeFromNib: оба вызываются, поэтому объекты просто добавляются к ничто и ничего не происходит. Если символ scrollview не был равен нулю, я уверен, что это сработает.

Контроллеры: есть два контроллера, которые используют это, один выполняется с initWithFrame: и работает отлично, а другой встраивает его в качестве ссылки на основе nib. (Как уже упоминалось в другом месте здесь, определение UIView в IB, установка настраиваемого класса.) Я прошел через код, и это представление - инициализируется правильно - только его подпункты "отсутствуют".

Помогает ли это дать более четкое представление о ситуации?

Ответы

Ответ 1

Возможно, вы не понимаете, как работает загрузка nib. Если вы определяете пользовательский UIView и создаете файл nib для выкладки своих подзонов, вы не можете просто добавить UIView в другой файл nib, измените имя класса в IB на свой собственный класс и ожидайте, что система загрузки nib будет выяснять это. Вам необходимо изменить initWithCoder вашего пользовательского класса UIView, чтобы программно загрузить nib, который определяет его макет subview. например:.

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];
        [self addSubview:self.toplevelSubView];
    }
    return self;
}

В вашем пользовательском представлении nib файла должен быть установлен класс "Владелец файла" для вашего пользовательского класса просмотра, и вам нужно иметь выход в свой пользовательский класс под названием "toplevelSubView", подключенный к представлению в вашем пользовательском файле nib файла, который выступая в качестве контейнера для всех подзонов. Добавьте дополнительные выходы в класс просмотра и подключите подпрограммы к "Владелец файла" (ваш пользовательский UIView).

В качестве альтернативы просто создайте свой программный вид программно и обходите IB.

Ответ 2

Убедитесь, что вы вызываете "супер" реализацию initWithCoder: и awakeFromNib в каждом из ваших переопределенных методов i.e.

- (id)initWithCoder:(NSCoder *)decoder {
    if ((self = [super initWithCoder:decoder])) {
      ...your init code...
    }
    return self;
}

- (void)awakeFromNib {
     [super awakeFromNib];
     ...your init code...
}