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