initWithNibName не вызывается

Мне нужно поместить в свое приложение для iPhone некоторую пользовательскую логику, чтобы в зависимости от того, какую версию iOS вы используете, выбрать другой файл XIB (т. е. iPhone или iPad будут отображать разные файлы XIB).

Я создал все приложение для iPhone с первого дня, и все было хорошо, используя tabbarcontroller и стандартные навигационные контроллеры на каждой вкладке.

Итак, я реализовал:

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle

метод, только чтобы обнаружить, что он не вызывается. (У меня есть точка останова и операторы журнала, и ничего не происходит).

Кто-нибудь знает, почему это может быть? ИЛИ как реализовать эту функцию?

Я где-то читал, что initWithNibName вызывается только тогда, когда вы его вызываете, т.е. когда вы программно строите иерархию представлений, это правда??


person Mark    schedule 07.09.2010    source источник


Ответы (2)


Если вы не делаете что-то подобное, прежде чем добавлять его в свой навигационный контроллер:

SomeViewController *someViewController = [[SomeViewController alloc] initWithNibName:...];

Тогда велика вероятность, что вы переопределяете неправильный метод.

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

Вместо этого вам придется переопределить -awakeFromNib.

person BoltClock    schedule 07.09.2010
comment
Хорошо, понятно, спасибо, так как же мне выбрать XIB из этого метода? - person Mark; 08.09.2010
comment
Что вы подразумеваете под выбором xib? - person BoltClock; 08.09.2010
comment
ну, мне нужны разные файлы XIB в зависимости от того, работаю ли я на iPad или iPhone, как я могу этого добиться? - person Mark; 08.09.2010
comment
Ах, ну, боюсь, я не знаком с универсальными приложениями, поэтому я не могу вам помочь, извините :/ - person BoltClock; 08.09.2010
comment
все в порядке, я узнал, как это сделать... 1. Обновите свою цель, чтобы она была единым универсальным приложением 2. Обратите внимание на новый файл XIB XXX-iPad.xib, который xcode создает для вас 3. Создайте новые файлы XIB которые соответствуют вашему приложению iPad (вы можете создавать новые файлы XIB, которые указывают на ваши существующие UIViewController, просто добавьте один View XIB, измените его класс на ваш существующий контроллер представления) 4. Внутри этого файла XIB измените обычные файлы XIB, которые загружаются , чтобы указать на новые файлы XIB, которые вы создали на шаге 3. 5. Подключите свои IBOutlet, как обычно, в новом XIB. - person Mark; 08.09.2010
comment
подкласс представления. Один для iPad один для iPhone - person Septiadi Agus; 18.07.2013

Если ваши контроллеры представления загружаются из файла .xib, вместо этого будет вызываться файл initWithCoder:. Метод initWithNibName:bundle: используется только для программного создания контроллеров представлений.

person Stefan Arentz    schedule 07.09.2010