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

У меня есть пользовательский 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: оба они вызываются, поэтому объекты просто добавляются вноль и ничего не происходит.Если бы символ прокрутки не был nil, я уверен, что это будет работать.

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

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

Ответы [ 2 ]

51 голосов
/ 29 сентября 2011

Возможно, вы неправильно понимаете, как работает загрузка пера.Если вы определяете пользовательский 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;
}

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

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

5 голосов
/ 28 сентября 2011

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

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

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