подкласс UIViewController не может вызвать метод loadView

у меня есть подкласс UIViewController, и когда он вызывается из другого класса, приложение просто зависает - я использовал отладчик Xcode и понял, что когда я пытаюсь получить доступ к свойству представления класса, приложение зависает. еще одна странность заключается в том, что когда я набираю в панели управления отладчиком: «po objectOfTheProblematicClass.view», отладчик перестает отвечать. код, который я использовал, был похож на этот:

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
WTStickyViewController *stickyVC = [sb instantiateViewControllerWithIdentifier:@"WTStickyViewController"];
stickyVC.sticky = sticky;
// Setup view controller containment:
[self.parentViewController addChildViewController:stickyVC];

self.containerView = self.parentViewController.view;
[self.containerView addSubview:stickyVC.view];

WTStickyViewController является подклассом UIViewController. приложение зависает, когда достигает

       [self.containerView addSubview:stickyVC.view];

но это потому, что это первый раз, когда вызывается stickyVC.view.
если бы, например, я бы поместил где-нибудь в коде

UIView *viewForExample = stickyVC.view;

приложение зависало бы там.
то же самое приложение отлично работает при компиляции на устройстве с iOS 8, но имеет эту проблему с iOS 9. если кто-нибудь знает, почему это происходит и есть ли решение, это будет здорово. Спасибо.


person Nitzan R    schedule 07.09.2015    source источник
comment
Вы вызвали super в своем методе viewLoad подкласса   -  person Raheel Sadiq    schedule 07.09.2015
comment
Проверьте свои точки останова. Xcode может зависнуть при попытке сломаться, если есть ошибка в условии или команде точки останова.   -  person    schedule 07.09.2015
comment
Обновите свой вопрос соответствующим кодом, вызывающим проблему.   -  person rmaddy    schedule 07.09.2015
comment
@PetahChristian даже без точек останова приложение зависает.   -  person Nitzan R    schedule 07.09.2015
comment
@RaheelSadiq Я не переопределял loadView, если вы это имели в виду   -  person Nitzan R    schedule 07.09.2015
comment
Когда приложение зависает, приостановите его в отладчике и посмотрите, что происходит на дисплее стека.   -  person Phillip Mills    schedule 07.09.2015
comment
@PhillipMills я сделал, и когда коду будет предложено получить доступ к stickyVC. просмотрите зависание приложения, а также отладчик! я ничего не могу сделать после того, как достигну этой строки кода.   -  person Nitzan R    schedule 07.09.2015
comment
после некоторой отладки я пришел к выводу, что проблема определенно связана с методом loadView, который вызывается каждый раз при доступе к свойству представления.   -  person Nitzan R    schedule 07.09.2015


Ответы (2)


У меня была похожая проблема, и это было совершенно безумно. ЦП в мониторе ресурсов во время отладки был загружен примерно на 100%, поскольку приложение заблокировалось. Такое поведение вызывалось печатью на консоль или просто обычным доступом к свойству представления контроллера представления. В конечном счете, что «исправило» это для меня, так это удаление его из базового файла локализации. Я знаю, что это не имеет смысла, но я уточню, как смогу.

Я поддерживаю устаревшее универсальное приложение с двумя «основными» раскадровками, называемыми Main_iPhone и Main_iPad, которые, как вы, вероятно, догадываетесь, загружаются динамически в зависимости от того, на каком устройстве вы запускаете. Я заметил, что, как описано, только представление пера iPhone блокировалось, а iPad загружался нормально. Единственное, что я мог сказать, это то, что в раскадровке iPhone была включена локализация, а в раскадровке iPad — нет. Итак, вот шаги, которые я предпринял, чтобы удалить его из базовой локализации (вы можете сделать это в отдельной ветке/песочнице, чтобы убедиться, что это работает, прежде чем удалять ссылки на проект):

  1. Щелкните правой кнопкой мыши проблемный вид и / или раскадровку, чтобы показать в поиске. Для меня это было внутри папки Base.lproj, как и ожидалось.
  2. [Пере] переместите файл в другой каталог, чтобы Xcode не мог найти ссылку на проект (файл становится красным в файловом браузере). Нажмите «Удалить», чтобы удалить файл из ссылки на файл проекта из самого проекта.
  3. Добавьте файл обратно в новое место в структуре репозитория/проекта, чтобы Xcode забрал его как новый файл. Убедитесь, что все ваши ссылки на файл обновлены до нового местоположения.
  4. Убедитесь, что файл раскадровки/xib больше не локализован, очистите проект, перезапустите и посмотрите, сохраняется ли проблема (см. изображение). Нелокализованная настройка

Вы также можете просто обновить местоположение файла, используя кнопку «Обновить местоположение» в представлении свойств файла с правой стороны (см. другое изображение). введите здесь описание изображения

Не знаю, исправит ли это это, но я подумал, что поделюсь тем, что помогло мне, если это поможет и другим.

person Jack B    schedule 20.10.2015
comment
похоже у вас была точно такая же проблема. Поскольку я написал вопрос, я проконсультировался с более опытным разработчиком, чем я, и мы решили, что проблема как-то связана с новым Xcode 7. При компиляции на Xcode 6 он работает нормально. Мы, вероятно, собираемся сообщить об этом в Apple, и, надеюсь, они исправят эту проблему. - person Nitzan R; 21.10.2015
comment
Это казалось странным, и я попытался воссоздать его в тестовом проекте, пока безуспешно. Если вы отправите отчет об ошибке, я был бы признателен, если бы вы разместили ссылку на открытый радар. - person Jack B; 21.10.2015

В Apple был отправлен отчет об ошибке, и, надеюсь, он будет исправлен в ближайшее время - проблема действительно связана с Xcode 7. Если вы столкнулись с похожей проблемой, ее можно решить, выполнив одно из следующих действий: 1) Используйте Xcode 6.4, по крайней мере пока Apple не исправит эту ошибку.

2) Восстановите проблемное представление в раскадровке.

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

person Nitzan R    schedule 27.10.2015