Как я могу сделать так, чтобы мой Nib загружал мой настроенный подкласс UIScrollView?
-
08-07-2019 - |
Вопрос
У меня был хороший UIScrollView внутри моего пера, который работал хорошо. Тогда у меня были некоторые очень особые потребности и подкласс UIScrollView. В моем Nib я изменил класс в инспекторе удостоверений на мой подкласс.
Но по какой-то причине мой -initWithFrame: метод никогда не вызывается, когда загрузчик пера собирает все эти объекты из пера. На самом деле я ничего не изменил прямо сейчас в моем подклассе. И представление прокрутки просто отлично работает. Ожидайте, что это будет пустой UIScrollView, даже если я сказал, что это должен быть SpecializedUIScrollView для целей тестирования.
Есть ли что-то еще, что я должен учитывать при создании подкласса UIScrollView, в то же время все еще используя файл Nib, чтобы представить его в перспективе?
Мой выделенный инициализатор выглядит так:
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
NSLog(@"Hello !!!!!!!!!!!!!");
}
return self;
}
Я никогда не вижу этот Hello в консоли, если я пытаюсь загрузить его из Nib. Конечно, если я выделю и инициализирую это сам, это работает. Но я не хочу позиционировать свой вид прокрутки программно, если я могу вместо этого использовать этот чертовски крутой Интерфейсный Разработчик.
Решение
Объекты в nib или xib хранятся как сериализованные объекты, это может означать, что вам нужно использовать метод awakeFromNib
, потому что методы init никогда не вызываются.
Другие советы
Расширьте initWithCoder
, обязательно вызовите супер метод. Именно во время этого супер-вызова в вашем классе будет вызываться setFrame
.
Затем вы можете повторно использовать свой стандартный вызов initWithFrame
в initWithCoder
, и разработчик интерфейса будет контролировать размер кадра.
- (id)initWithCoder:(NSCoder *)aDecoder {
[super initWithCoder:aDecoder]; // Required. setFrame will be called during this method.
return [self initWithFrame:[self frame]];
}