Подтвердить что ты не робот

Неожиданное окно 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

4b9b3361

Ответ 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)