2015-11-05 5 views
0

Я следил за учебником, изложенным здесь, чтобы загрузить пользовательский xib в моем контроллере представления.Почему пользовательский xib требует свойства UIView

класс XIb наследует от UIView, но также необходим вид собственности:

@interface MYBannerView : UIView 
@property (nonatomic, weak) IBOutlet UIView *view; 
@end 

я нахожу это странным, что он нуждается в этом, как его, как имеющий вид в пределах зрения, кажется излишним. Есть ли какая-то особая причина для этого?

Редактировать

Я после этого учебника здесь, который обрисовывает в общих чертах это:

http://www.maytro.com/2014/04/27/building-reusable-views-with-interface-builder-and-auto-layout.html

+0

теоретически вам не нужно свойство, вы можете использовать себя ... – kikko088

+2

зачем ему это нужно? где вы это читали? –

+0

Я добавил исходную ссылку, которую я использовал в качестве учебника – user1686342

ответ

0

Автор этого урока использует выход вида для загрузки вид из XIb когда MYBannerView инициализируется программно

- (instancetype)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     NSString *className = NSStringFromClass([self class]); 
     self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject]; 
     [self addSubview:self.view]; 
     return self; 
    } 
    return nil; 
} 

Все созданные в Interface Builder не будет загружен с programatic init. loadNibNamed загружает пользовательский интерфейс из xib.

Если вы хотите переопределить initWithFrame: для загрузки элементов пользовательского интерфейса из XIb, ваш метод инициализации будет выглядеть примерно так:

- (instancetype)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; // initialize your objects 

    if (self) { 
     [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; // load your view from IB 
    } 

    return self; // return the view with all of the IB UI loaded 
} 
+0

Все еще не на 100% прозрачный. Как я понимаю, когда XIB загружается программно, вызывается initWithFrame и initWithCoder вызывается только тогда, когда UIView устанавливается с соответствующим классом в IB. То, что я пытаюсь получить, - это: возможно ли создать XIB, добавить компоненты пользовательского интерфейса с IB в Owner Owner, а затем инициализировать программно с помощью initWithFrame. – user1686342

+0

Чтобы инициализировать любой объект UIView, созданный с помощью построителя интерфейса, вы должны вызвать 'loadNibNamed:', чтобы загрузить представления из xib. Я редактировал сообщение, чтобы показать пример с 'initWithFrame:' ​​ – JAL

+0

Спасибо за совет. Поэтому просто для уточнения, если бы я добавил несколько кнопок и меток на XIB через IB, а затем программным образом загрузил IB (что вызовет initWithFrame), тогда эти метки и кнопки не будут загружаться? – user1686342

0

Нет, ваш UIView подкласс не нуждается выход к мнению, чтобы быть функциональным. Фактически, используя self, вы имеете доступ к самому представлению. Что относительно учебника: когда автор добавил view A (назовем его так) на MYViewController's вид, он установил view A класс, который будет MYBannerView. Запуск приложения ничего не отобразит, потому что MYBannerView xib не был загружен и не заменил контент с view A. Поэтому автор загружает этот xib в initWithCoder, устанавливает выход с использованием значения, возвращаемого loadNibNamed:, и добавляет вид, загруженный с MYBannerView в view A. Процесс немного запутан, но он работает.

Смежные вопросы