Корневой UIViewController отвечает на изменения ориентации, но второй UIViewController не - PullRequest
0 голосов
/ 15 марта 2012

Я публикую это, потому что, после борьбы с этой проблемой в течение большей части дня (и многих, многих поисков в Google и StackOverflow), я наконец нашел проблему, но я нигде не видел этого решения.

У меня есть приложение с UINavigationController в качестве корневого контроллера и двумя UIViewController, которые принадлежат корневому контроллеру.Все они созданы программно, я вообще не использую Interface Builder.Оба UIViewController настроены для обработки вращения во всех ориентациях (предположительно), но только корневой UIViewController вращается правильно.Для второго UIViewController shouldAutoRotateToInterfaceOrientation запускается один раз, но никогда не запускается снова, а willRotateToInterfaceOrientation никогда не запускается вообще.

Контроллер проблемного вида имеет только стандартные элементы управления для подпредставлений: UILabel, UITextView и UISwitch.Он не включает tabBar или любой другой контроллер представления в качестве subView.View и VC оба находятся в области видимости и выглядят здоровыми.Все взаимодействие с представлением работает правильно, кроме вращения.

Я специально звоню:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications

и реализую:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

вместе с методом didRotate ничего не изменило.

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Проблема, которую я обнаружил, была глупой с моей стороны: я звонил alloc на экземпляре контроллера представления без init (потерялся в редактировании, в мою защиту).То, что сделало это настолько удивительным, было то, что представление функционировало правильно во всех других отношениях.Я прочитал этот технический вопрос и ответ Apple: http://developer.apple.com/library/ios/#qa/qa1688/_index.html, но не связал его с проблемой, с которой я столкнулся.Ключевой строкой является последнее предложение: для правильной инициализации объекта вы должны вызывать super для любого метода init или initWithNibName, который вы переопределяете для своих контроллеров представления.Поскольку init вообще никогда не вызывали, конечно, [super init] тоже не было.

0 голосов
/ 15 марта 2012

В iOS 5, если вы добавляете представления вручную, вполне возможно, что вам нужно применить метод addChildViewController:

...