2015-06-08 2 views
0

У меня есть класс, основанный на UIView, который имеет свой собственный XIB. Позволяет назвать этот класс MyClass. Поэтому у меня есть MyClass.xib, MyClass.h и MyClass.m.Пытается загрузить наконечник из конструктора интерфейса

У меня есть объект UIView на раскадровке, и я установил класс этого объекта в MyClass.

Я создал новый X12 X12 и XIB, я изменил класс владельца файла на MyClass. Я не знаю, нужно ли мне делать больше соединений внутри XIB.

То, что я хочу это: раскадровка нагрузки MyClass.m и что нагрузки MyClass.xib, по этой причине у меня есть этот код инициализации:

- (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; 
} 

Проблема в том, что этот код попадает в бесконечный цикл. Я думаю, loadNibNamed снова вызовет initWithCoder: и приложение выйдет из строя.

Как это сделать? Почему цикл и есть ли какие-либо соединения, которые должны быть сделаны внутри xib?

+1

Я не помню правильный способ сделать это прямо сейчас, но короткая история в том, что 'loadNibNamed:' 'фактически называет initWithCoder:', так что объясняет ваш бесконечный цикл мгновенно ... – nhgrif

ответ

0

I попробовали все ответы, но это единственный код, который работал, после нескольких испытаний:

- (instancetype)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 

    if (self.view == nil) { 
    NSBundle *mainBundle = [NSBundle mainBundle]; 
    [mainBundle loadNibNamed:@"MonthDayPicker" owner:self options:nil]; 

    [self addSubview:self.view]; 
    return self; 

    } 

    return nil; 
} 
0

Использование self.subviews.count == 0 разрывает петлю, как это:

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

теперь он сбой в строке 'loadNibNamed' с сообщением ** Этот кодер требует, чтобы замененные объекты возвращались из initWithCoder: ** – SpaceDog

+0

Это означает, что вы должны использовать awakeAfterUsingCoder с раскадными версиями. Попробуй это. Я не использую раскадровки, хотя я не могу комментировать. http://cocoanuts.mobi/2014/03/26/reusable/ –

+0

та же авария ..... – SpaceDog

0

позволяет сделать, как показано ниже

инициировать его awakeFromNib способом, например

в MyClass.m файле

- (instancetype)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if(self) 
    { 
     //set up hear 
    } 
    return self; 
} 

- (instancetype)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if(self) 
    { 

    } 
    return self; 
} 


- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    //set up hear 
    NSString *className = NSStringFromClass([self class]); 
    UIView *view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject]; 
    [self addSubview:view]; 
}