Основной вид исчезает во время аутентификации в игровом центре

У меня есть приложение iOS, для которого я только начинаю реализовывать поддержку игрового центра. Я вызываю метод authenticationWithCompletionHandler во время loadView для моего основного (корневого) контроллера представления. Отображается мой основной вид, и вскоре после этого диалоговое окно «Войти в игровой центр» появляется точно так, как и ожидалось. Если выбрано «Создать новую учетную запись», всплывающее диалоговое окно «Новая учетная запись» игрового центра отображается в середине экрана (это на iPad), но мое основное главное меню исчезает. Под всплывающим диалоговым окном просто черный экран. Если я закрою диалоговое окно в обработчике завершения, оно исчезнет, ​​как и ожидалось, и мое главное меню вернется.

Я полагаю, что это должна быть какая-то проблема с иерархией представлений, и поэтому, чтобы попытаться упростить проблему, я создал новый проект. Используя Xcode 4.3.2, я изменил новый проект iOS «Пустое приложение», добавив один класс контроллера представления «AppViewController». Я изменил созданный системой метод applicationDidFinishLaunchingWithOptions файла AppDelegate.m, чтобы установить rootViewController (сразу после того, как цвет фона окна стал белым):

self.window.rootViewController =
    [[[AppViewController alloc] initWithNibName:nil bundle:nil] autorelease];

... и я установил метод loadView AppViewController для загрузки представления с цветным фоном (чтобы я мог сказать, правильно ли он компонуется поверх него), а затем вызываю метод аутентификации gamekit:

- (void) loadView {
    self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
    self.view.backgroundColor = [UIColor yellowColor];
    GKLocalPlayer * localPlayer = [GKLocalPlayer localPlayer];
    [localPlayer authenticateWithCompletionHandler:nil];
}

Эта простая структура в точности имитирует то, как у меня настроена иерархия представлений — один UIViewController, заданный как rootViewController окна, который загружает и управляет иерархией представлений. XIB-файлов нет.

Во всяком случае, я получаю точно такое же поведение с этим очень простым тестовым приложением. Когда появляется всплывающее диалоговое окно «Новая учетная запись», мое основное представление (в данном случае желтая заливка) исчезает (и отображается белая заливка основного окна). Я предполагаю, что это связано с моим непониманием того, как iOS хочет, чтобы я управлял этими контроллерами и представлениями.

Однако, что особенно странно (по крайней мере, для меня), так это то, что если я либо отменяю действие из окна «Новая учетная запись», либо вхожу в систему, используя существующую учетную запись, а затем сразу же открываю всплывающее диалоговое окно достижения (используя presentModalViewController), которое работает ! Я вижу свое главное меню за диалоговым окном достижений. Добавление простой кнопки в представление и обработчик нажатия кнопки в контроллер представления показало то же самое — диалоговое окно достижений показывает фоновое представление очень хорошо, но диалоговое окно «Новая учетная запись» скрывает основное представление. Очевидно, я хотел бы, чтобы диалоговое окно «Новая учетная запись» выглядело так, будто оно плавает поверх моего основного представления. Я должен упомянуть, что тестирую iOS 5.1.

Спасибо за любую помощь, которую вы могли бы мне оказать!

ОБНОВЛЕНИЕ: После того, как я последовал совету из другого сообщения stackoverflow, я купил «Начало разработки iOS 5» Джеффа Ламарша, Дэвида Марка и Джека Наттинга и просмотрел раздел о том, как начать с шаблона Xcode «Пустое приложение». . Это заставило меня немного изменить тестовый код. Вместо установки свойства rootViewController напрямую, теперь я делаю это в applicationDidFinishLaunchingWithOptions:

UIViewController * viewController =
    [[[AppViewController alloc] initWithNibName:nil bundle:nil] autorelease];
viewController.view.backgroundColor = [UIColor yellowColor];
[self.window addSubview:viewController.view];

Я также избавился от вышеупомянутого метода loadView на моем контроллере представления. Это работает! Кто-нибудь знает, почему? Я не вижу существенной разницы между этими двумя системами. В первом случае я воссоздаю представление в контроллере представления (во второй системе нет alloc/init в представлении контроллера представления); Есть ли что-то особенное в представлении, которое создается автоматически?

ОБНОВЛЕНИЕ x2: хорошо, похоже, что реальная разница заключается в строке:

[self.window addSubview:viewController.view];

Я думал, что установка rootViewController в окне автоматически добавит представление в окно, но если я не сделаю это явно, я получаю это странное поведение. Итак, я нашел обходной путь для этой проблемы, я просто не понимаю, почему это работает. Любые идеи? Спасибо!


person vedinerd    schedule 12.05.2012    source источник
comment
+1 У меня была такая же проблема. Использование addSubview исправило это. Спасибо! Вы должны опубликовать это как ответ.   -  person rasmus    schedule 11.07.2012


Ответы (1)


Я не уверен, что вызывает вашу проблему, но метод authenticationWithCompletionHandler обычно вызывается, как только ваше приложение запускается. Попробуйте переместить его в метод applicationDidFinishLaunchingWithOptions в вашем appDelegate и посмотрите, работает ли он тогда.

person Kaan Dedeoglu    schedule 12.05.2012
comment
Привет -- спасибо за помощь! К сожалению, это не изменило поведения. Я до сих пор не могу понять это. - person vedinerd; 12.05.2012