2012-05-04 2 views
4

Для повторного использования определенного поднабора в моем приложении (которое основано на раскадровке), я решил построить подвью в качестве наконечника и загрузить его. , Я сделал следующее:Бесконечные рекурсивные вызовы initWithCoder при создании экземпляра xib в раскадровке

У меня есть подкласс UIView, который мы можем назвать Виджет. Я создаю соответствующий файл xib, устанавливаю свойство владельца файла в мой новый подкласс, подключаю IBOutlets.

Затем в моей раскадровке у меня есть uiview внутри контроллера вида, и я установил его класс в класс Widget, который я создал.

В классе виджета, я переопределить initWithCoder, и там загрузить перо следующим образом:

-(id)initWithCoder:(NSCoder *)aDecoder{ 
    if ((self = [super initWithCoder:aDecoder])){ 
     [self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"Widget" owner:self options:nil] objectAtIndex:0]]; 
    } 
    return self; 
} 

приложение будет врезаться в этот момент, и установив точку останова здесь выяснилось, что initWithCoder в настоящее время подозвал и снова.

Кажется, что в этой ситуации я использовал два метода для использования наконечника, но я не знаю, где я ошибся. При необходимости я могу вырвать трассировку стека, но это в основном бесконечные вложенные вызовы для одной и той же функции.

ответ

17

Возможно, вы установили «Пользовательский класс» View в ваш .xib-файл на «Виджет»?

Это могло бы объяснить поведение, которое вы видите, потому что initWithCoder: является инициализатором для всех вещей, загруженных из XIb:

  1. Вашего родительского представления, которое содержит объект Widget, загружается из XIb
  2. метод
  3. виджета initWithCoder: вызывается, и пытается загрузить виджете XIb
  4. XIB Виджет содержит UIView с пользовательского класса «Widget», так что опять, объект Widget инициализируется с initWithCoder: и т. Д.

Если это действительно так, все, что вам нужно сделать, это удалить запись «Пользовательский класс» для UIView в xib вашего виджета.

+0

, но если вы удалите значение пользовательского класса, невозможно использовать его IBOutlets и IBActions ... – nano

+0

@nano Конечно, вы можете использовать пользовательский класс для своего вида; вам просто нужно предотвратить рекурсию. –

+0

Какой лучший способ предотвратить рекурсию без удаления «Пользовательского класса» из xib? – Jaro

2

У меня была такая же проблема. Моя ошибка была в пустом классе владельца файла. Собственный класс владельца файла должен быть НЕ пустым (виджет), а корневой вид должен быть пустым.

IBActions и IBOutlets были в порядке.