Бесконечные рекурсивные вызовы initWithCoder при создании экземпляра xib в раскадровке

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

У меня есть подкласс UIView, который мы можем назвать Widget. Я создаю соответствующий файл 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 вызывается снова и снова.

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

Ответ 1

Вам удалось установить вид "Пользовательский класс" в вашем .xib файле на "Виджет"?

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

  • Ваше родительское представление, содержащее объект Widget, загружается из xib
  • Вызывается метод Widget initWithCoder: и пытается загрузить виджет xib
  • Виджет xib содержит a UIView с пользовательским   Класс "Виджет", поэтому снова объект Widget инициализируется с помощью   initWithCoder: и т.д.

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

Ответ 2

У меня была такая же проблема. Моя ошибка была в пустом классе File Owner. В пользовательском классе File Owner не должен быть пустым (Widget), а корневой вид должен быть пустым.

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