意外的nil窗口在_UIApplicationHandleEventFromQueueEvent中

42

我的一款旧应用程序在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,其中包括我的Window对象以及一个UINavigationController,第一个视图控制器也定义在其中。下面的图片显示了与App Delegate连接的输出口。

屏幕截图中白色的"view"是UIWindow。右侧的视图是UINavigationController(导航栏隐藏),其中定义了第一个视图控制器。

enter image description here

我该如何解决这个问题,而无需从头开始创建一个新项目来重新生成应用程序?

编辑:我刚发现有一个微小的条带,在那里我的按钮实际上会接收到它们的轻按/点击。

我还注意到我的self.view.window为nil。我该如何确保设置了它?

enter image description here


这里没有任何答案对我有用。一个解决方法是切换到故事板,它们似乎没有这个问题。 - mrueg
13个回答

44

除了B H的答案,还可以参考这个答案

当我从纵向方向启动我的仅支持横向方向的应用时,出现了这个问题(应用程序在最近打开的应用程序列表中不应该显示,可以通过按两次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
self.window.frame = ... 这行代码解决了我的问题。在我的运行iOS8的iPhone5上,视图正常显示。但是,在我的运行iOS7的iPhone4上,所有的内容似乎都向左偏移了20个像素。旋转设备可以将其恢复到正确的位置。 - user1057831
这段代码适用于没有故事板的旧应用程序。[self.window setRootViewController:viewController]; [window makeKeyAndVisible]; self.window.frame = [[UIScreen mainScreen] bounds]; - Greg

21

您不需要添加任何代码来修复此问题。

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

输入图像描述


1
我正在使用Storyboard,没有看到任何关于“window”的内容。 - RomanKousta

4

请检查您的Window nib文件,确保它占据了整个屏幕。在我的应用程序中,出现了类似的问题,右侧的触摸事件无法注册。一旦我将我的MainWindow.xib设置为全屏,就没有出现错误并且触摸事件再次正常工作了。我的应用程序也在横向显示,但我的MainWindow.xib具有纵向尺寸。


我以前遇到过这个问题,所以我首先检查了一下。它被设置为占据整个屏幕。 - Kenny Wyland
1
有关于编程的内容,我调查了一下,在我的主屏幕视图控制器中,我反复执行了 po [self.view superview]po [[self.view superview] superview]po [[[self.view superview] superview] superview] 等操作,直到(经过6个层级)我得到了一个大小为320x480的UIWindow,即使其他所有东西的大小都是375x667。这清楚地表明UIWindow不正确。 - Hot Licks

4
有时候可能只是缺少一些简单的设置:点击项目(无论你将其命名为什么)名称,然后确保选择了常规选项卡并向下滚动。查找应用程序图标和启动图像,确保启动屏幕文件字段中有一些值,这应该是Main或LaunchScreen

3
如果有人发现这个有用的话:
在我的情况下,我使用了

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

替代

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

这就是问题的原因。

1
我在一个旧应用程序上遇到了这个错误,该应用程序没有Default-568h@2x.png启动屏幕。当更高的iPhone首次推出时,这是向iOS发出的信号,表明应用程序可以处理新的几何形状。否则,它将以320x480窗口显示。有趣的是,我甚至没有注意到应用程序没有使用全屏幕。

0

启用 Windows 用户交互对我很有帮助。

window.isUserInteractionEnabled = true

0

我也在升级我的旧项目到iOS 7和iOS 8。

实际上,我不使用MainWindow.xib,而是在application:didFinishLaunchingWithOptions:中手动创建window。

但是启动后我遇到了同样的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]));
    }
}

0

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


0
如果有其他人也遇到了类似的问题,我想提供一点帮助。当我在设置窗口框架时,UIScreen.mainScreen().bounds 的大小被翻转了,导致了这个错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接