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

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

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

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

Заранее спасибо!

Редактировать: (Код выложен для Nekto в соответствии с просьбой... как вы увидите, он делает запись и все, хе.)

- (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: перья, контроллеры, подпредставления и т. Д.

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

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

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

2 ответа

Решение

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

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

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

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

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

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

- (void)awakeFromNib {
     [super awakeFromNib];
     ...your init code...
}
Другие вопросы по тегам