Создание многоразового UIView с xib (и загрузка из раскадровки)
Хорошо, в StackOverflow есть десятки сообщений об этом, но ни одно из них не совсем ясно в отношении решения. Я хотел бы создать кастомUIView
с сопроводительным XIB-файлом. Требования следующие:
UIViewController
- полностью автономный классРозетки в классе, которые позволяют мне устанавливать / получать свойства видаМой текущий подход к этому:
Override-(id)initWithFrame:
-(id)initWithFrame:(CGRect)frame {
self = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class])
owner:self
options:nil] objectAtIndex:0];
self.frame = frame;
return self;
}
Создавать программно используя-(id)initWithFrame:
на мой взгляд контроллер
MyCustomView *myCustomView = [[MyCustomView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view insertSubview:myCustomView atIndex:0];
Это работает нормально (хотя никогда не звонит[super init]
и простая установка объекта с использованием содержимого загруженного пера кажется немного подозрительной - здесь есть советдобавить подпредставление в этом случае что тоже отлично работает). Тем не менее, я хотел бы иметь возможность создавать представление и из раскадровки. Так что я могу:
UIView
на родительском представлении в раскадровкеУстановите его пользовательский класс вMyCustomView
Override-(id)initWithCoder:
- код, который я видел чаще всего, соответствует такой схеме:
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
[self initializeSubviews];
}
return self;
}
-(id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self initializeSubviews];
}
return self;
}
-(void)initializeSubviews {
typeof(view) view = [[[NSBundle mainBundle]
loadNibNamed:NSStringFromClass([self class])
owner:self
options:nil] objectAtIndex:0];
[self addSubview:view];
}
Конечно, это не работает, независимо от того, использую ли я описанный выше подход или создаю экземпляр программно, оба заканчивают тем, что рекурсивно вызывают-(id)initWithCoder:
при входе-(void)initializeSubviews
и загрузка пера из файла.
Несколько других вопросов SO имеют дело с этим, таких какВот, Вот, Вот а такжеВот, Однако ни один из приведенных ответов удовлетворительно не решает проблему:
Распространенным предложением является встраивание всего класса в UIViewController и выполнение загрузки пера туда, но это кажется мне неоптимальным, так как требует добавления другого файла в качестве оболочкиМожет ли кто-нибудь дать совет, как решить эту проблему, и получить рабочие места в обычайUIView
с минимальной суетой / без тонкой оболочки контроллера? Или есть альтернативный, более чистый способ сделать что-то с минимальным стандартным кодом?