_UIApplicationHandleEventFromQueueEvent中的意外nil窗口

时间:2014-09-21 19:37:57

标签: ios8 hittest uiwindow

我的一个旧应用程序无法使用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,它也在其中定义了第一个View Controller。下图显示了连接到App Delegate的Outlets。

白色&#34;视图&#34;在下面的屏幕截图中是UIWindow。右边的视图是UINavigationController(导航栏隐藏),其中定义了第一个ViewController。

enter image description here

如何在不使用新项目从头开始重新创建整个应用程序的情况下解决此问题?

编辑:我刚刚发现有一个TINY条带,其中我的按钮实际上会收到他们的点击/点击。

我也注意到我的self.view.window是零。如何确保设置?

enter image description here

12 个答案:

答案 0 :(得分:44)

除了B H答案之外。另请查看this answer

从纵向启动我的横向应用程序时出现此问题(也不应该在最近打开的应用程序列表中显示应用程序,可以通过按Home键两次看到。也许,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];

所以在窗口从根视图控制器获取方向后设置框架。

答案 1 :(得分:22)

您无需添加任何代码来解决此问题。

打开主xib文件并从左侧找到“Window”并启用Visible at LaunchFull Screen at launch

enter image description here

答案 2 :(得分:4)

查看您的Window nib文件并确保它占用全屏。我的应用程序上有一个类似的问题,触摸事件没有在右侧的条带上注册。一旦我将MainWindow.xib设置为占据全屏,我就不再有错误,触摸事件再次起作用。我的应用程序也在横向显示,但我的MainWindow.xib有纵向尺寸。

答案 3 :(得分:4)

有时它只是简单的设置而忽略了一些价值:点击项目(无论你命名为你的项目)名称项目,然后确保一般选项卡并滚动到底部。查找应用程序图标和启动图像确保启动屏幕文件字段中有一些值,这应该是Main或LaunchScreen

答案 4 :(得分:3)

如果有人发现这有用:

就我而言,我曾经使用过

self.window = [[UIWindow alloc] init];

而不是

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

这就是问题的原因。

答案 5 :(得分:1)

我在没有Default-568h@2x.png启动画面的旧应用上遇到此错误。当首次推出较高的iPhone时,这是iOS发出的信号,应用程序可以处理新的几何体。否则,它显示在320x480窗口中。有趣的是,我甚至没有注意到应用程序没有使用全屏。

答案 6 :(得分:0)

我无法测试efpies解决方案,但我在应用中修复它的方法是用故事板替换MainWindow.xib。

答案 7 :(得分:0)

我也将我的旧项目升级到iOS 7和iOS 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]));
    }
}

答案 8 :(得分:0)

我们遇到了同样的问题,我们在此主题中尝试了所提出的解决方案但没有成功。

最终为我们工作的是,重新编写逻辑以编程方式而不是使用xib。在此之后,我们没有看到意外的零窗口&#39;错误,视图在整个屏幕上都被点击。

答案 9 :(得分:0)

如果这有助于其他人在这里绊倒,我在设置窗口框架时翻转UIScreen.mainScreen().bounds尺寸时也会出现此错误。

答案 10 :(得分:0)

在我的情况下,这是一个旧代码,在阅读完整代码后,我发现了这一行

UIApplication.shared.delegate?.window??.isUserInteractionEnabled = false

我已按照自己的逻辑进行处理,并且现在可以正常工作。

答案 11 :(得分:-3)

使用新的ios 8&#39; nativeBounds&#39; UIScreen属性而不是&#39; bounds&#39;在创建窗口时为我解决了问题。无需其他更改。

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] nativeBounds]] autorelease];

为了支持以前的版本,我使用版本进行运行时检查:

if([[[UIDevice currentDevice]  systemVersion] floatValue] >= 8.0)