Неожиданное окно nil в _UIApplicationHandleEventFromQueueEvent
Одно из моих старых приложений не работает с iOS8. Когда я запускаю приложение и пытаюсь нажать на экран в любом месте, я получаю это сообщение в консоли:
unexpected nil window in _UIApplicationHandleEventFromQueueEvent,
_windowServerHitTestWindow: <UIWindow: 0x7fe4d3e52660; frame = (0 0; 320 568);
opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7fe4d3e2c450>;
layer = <UIWindowLayer: 0x7fe4d3e86a10>>
Я использую старый стиль MainWindow.xib. В MainWindow.xib есть мой объект Window, а также UINavigationController, у которого также есть свой первый контроллер просмотра. На изображении ниже показаны выходные данные, связанные с делегатом приложения.
Белый "вид" на скриншоте ниже - это UIWindow. Вид справа - это UINavigationController (скрытая панель навигации) с первым в нем ViewController.
![enter image description here]()
Как я могу исправить это, не воссоздавая все приложение с нуля с помощью нового проекта?
EDIT: Я только что обнаружил, что есть полоса TINY, в которой мои кнопки будут получать свои краны/клики.
Я также заметил, что мой self.view.window равен нулю. Как я могу убедиться, что это установлено?
![enter image description here]()
Ответы
Ответ 1
Дополнительно к B H ответ. Также посмотрите этот ответ.
У вас возникла эта проблема при запуске моего приложения только с портретом (также приложение не должно отображаться в недавно открывшемся списке приложений, что можно увидеть, нажав кнопку "Домой" дважды. Возможно, iOS каким-то образом кэширует ориентацию и размер окна).
Мой код был
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];
Я установил W+H
авторезистирующую маску для окна, это мне не помогло, потому что окно не изменяется при вращении, но изменяется матрица transform
.
Решение прост
self.window = [UIWindow new];
[self.window makeKeyAndVisible];
self.window.frame = [[UIScreen mainScreen] bounds];
Итак, кадр устанавливается ПОСЛЕ того, как окно получает ориентацию от контроллера корневого представления.
Ответ 2
Вам не нужно добавлять код, чтобы исправить это.
Откройте основной файл xib и найдите "Окно" с левой стороны и включите Visible at Launch
и Full Screen at launch
.
![enter image description here]()
Ответ 3
Посмотрите на свой файл Window nib и убедитесь, что он занимает весь экран. У меня была аналогичная проблема в моем приложении, где события касания не регистрировались на полосе с правой стороны. Как только я установил свой MainWindow.xib для просмотра полноэкранного режима, у меня не было больше ошибок, и события касания снова работали. Мое приложение также отображалось в Пейзаже, но мой MainWindow.xib имел размеры портрета.
Ответ 4
Иногда это просто простая настройка, которая пропускает какое-то значение. Нажмите на элемент Проект (независимо от вашего имени), затем убедитесь, что выбрана вкладка Общие и прокрутите список до дно. Ищите Значки приложений и запускайте изображения, убедитесь, что есть какое-то значение в поле Запустить экранный файл, это должно быть либо Main, либо LaunchScreen
Ответ 5
Если кто-то найдет это полезным:
В моем случае я использовал
self.window = [[UIWindow alloc] init];
вместо
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
и это стало причиной проблемы.
Ответ 6
Я получал эту ошибку в старом приложении, у которого не было экрана запуска [email protected] Когда более высокие iPhones были впервые введены, это был сигнал iOS, который приложение могло бы обрабатывать новую геометрию. В противном случае он отображался в окне 320x480. Забавно, я даже не заметил, что приложение не использовало полный экран.
Ответ 7
Мне не удалось проверить решение efpies
, но способ, которым я исправил его в своем приложении, заключался в замене MainWindow.xib на раскадровку.
Ответ 8
Я также обновляю свой старый проект до iOS 7 и 8.
На самом деле, я не использую MainWindow.xib, но создаю window
вручную в application:didFinishLaunchingWithOptions:
.
Но у меня такая же ошибка unexpected nil window in _UIApplicationHandleEventFromQueueEvent
после запуска.
Итак, в моем случае проблема была решена путем изменения цели развертывания на 6.0
и замены кода в main.m
:
Старый main.m:
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
Новый main.m:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([YourAppDelegate class]));
}
}
Ответ 9
У нас была та же проблема, и мы безуспешно пробовали предлагаемые решения в этом потоке.
То, что в конечном итоге работало для нас, заключалось в том, чтобы переписать логику, чтобы она была чистой программной, вместо использования xib. После этого мы не видим ошибки "неожиданного нулевого окна", и представление получает удар по всему экрану.
Ответ 10
В случае, если это помогает кому-то еще споткнуться здесь, я также получил эту ошибку, когда размер UIScreen.mainScreen().bounds
изменился при настройке оконного фрейма.
Ответ 11
Использование нового свойства UIScreen ios 8 'nativeBounds' вместо 'bounds' при создании окна исправило проблему для меня. Никаких других изменений не требуется.
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] nativeBounds]] autorelease];
Для поддержки предыдущей версии я также проверяю версию выполнения:
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)