ViewController не загружает подпредставления из nib в проекте ARC, работающем на iOS 4.3? - PullRequest
1 голос
/ 03 февраля 2012

Моя команда недавно преобразовала довольно большой проект в ARC. Преобразование прошло успешно, приложение работает и отлично работает на 5.0.

Проблема на 4.3. Любые контроллеры представления, созданные в коде с простым init, не загружают никакие подпредставления представления vc (это работает на 5.0)

Вот резюме:

Создание контроллера вида с помощью [[MyViewController alloc] init]. (Init-вызовы UIViewController initWithNibName: nil bundle: nil)

Загружает перо с тем же именем, что и у View Controller (MyViewController.xib)

* Ожидается: перо создается как обычно со всеми подпредставлениями верхнего уровня и всеми розетками, установленными

* Факт: создается перо, и устанавливается свойство view объекта MyViewController. Однако массив подпредставлений представления является пустым, и любые выходы к этим представлениям равны нулю, и представление представляется пустым при представлении

* Обходной путь: создать экземпляр VC / load nib с помощью

[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]

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

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Последующее действие в случае, если у кого-то еще есть эта проблема.

Поскольку мы поддерживаем 4.x и используем ARC, мы решили использовать MAZeroingWeakRef Майка Эша, чтобы получить слабый указатель в 4.x.В конце концов мы изолировали проблему достаточно, чтобы отследить ее до MAZeroingWeakRef.Мы опубликовали проблему в проекте MAZWR, и github и Майк объяснили, что происходит:

https://github.com/mikeash/MAZeroingWeakRef/issues/13

(В основном MAZWR меняет внутреннее имя класса VC на что-то вроде TestViewController_MAZeroingWeakRefSubclass. VC'sinit зависит от этого имени класса для загрузки связанного с ним пера - поэтому при его изменении он не может найти nib. Вызывая initWithNibName: bundle: и явно указав имя класса, соответствующий nib загружается правильно.)

0 голосов
/ 04 февраля 2012

Не уверен, что является причиной вашей проблемы, но если вы создадите общий базовый класс для всех ваших контроллеров представления, вы можете определить метод init как:

 - (id)init
 {
     return [self initWithNibName:NSStringFromClass([self class]) bundle:nil];
 }

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

Между прочим, иногда мне приходилось использовать этот трюк с UITableViewControllers, так как их метод init, кажется, не соответствует соглашению.

...