Загружая пользовательский 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...
}