_UIApplicationHandleEventFromQueueEvent 中出现意外的 nil 窗口
Posted
技术标签:
【中文标题】_UIApplicationHandleEventFromQueueEvent 中出现意外的 nil 窗口【英文标题】:Unexpected nil window in _UIApplicationHandleEventFromQueueEvent 【发布时间】:2014-09-21 19:37:57 【问题描述】:我的一个旧应用程序不适用于 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。
下面屏幕截图中的白色“视图”是 UIWindow。右边的视图是 UINavigationController(隐藏导航栏),其中定义了第一个 ViewController。
如何在不使用新项目从头开始重新创建整个应用的情况下解决此问题?
编辑:我刚刚发现有一个小条,其中我的按钮实际上会收到他们的点击/点击。
我还注意到我的 self.view.window 为零。如何确保已设置?
【问题讨论】:
这里没有一个答案对我有用。解决此问题的解决方法是切换到似乎没有此问题的 Storyboard。 【参考方案1】: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];
所以框架是在窗口从根视图控制器获取其方向之后设置的。
【讨论】:
self.window.frame = ...为我做了。之后,在我运行 iOS8 的 iPhone5 上,视图就正常了。但是 - 在我运行 iOS7 的 iPhone4 上,一切似乎都向左偏移了 20。旋转设备使其回到正确的位置。 这适用于没有情节提要的旧应用程序。 [self.window setRootViewController:viewController]; [窗口 makeKeyAndVisible]; self.window.frame = [[UIScreen mainScreen] bounds];【参考方案2】:您无需添加任何代码来解决此问题。
打开主xib文件,从左侧找到“Window”并启用Visible at Launch
和Full Screen at launch
。
【讨论】:
我正在使用故事板,没有看到任何“窗口”。【参考方案3】:检查您的 Window nib 文件并确保它占据了全屏。我在我的应用程序上遇到了类似的问题,触摸事件没有在右侧的条带上注册。一旦我将 MainWindow.xib 设置为全屏,我就没有更多错误,并且触摸事件再次起作用。我的应用也以横向显示,但我的 MainWindow.xib 具有纵向尺寸。
【讨论】:
我以前也遇到过这个问题,所以我先检查了一下。它被设置为占据全屏。 FWIW,在调查这个问题时,我在我的主屏幕 VC 中停下来,反复做po [self.view superview]
、po [[self.view superview] superview]
、po [[[self.view superview] superview] superview]
等,直到(6 层之后)我到 UIWindow,它有大小为 320x480,即使其他一切都是 375x667。这清楚地表明 UIWindow 不正确。【参考方案4】:
有时这只是缺少一些价值的简单设置:点击 Project(无论您如何命名您的项目)名称项,然后确保选择了 General 选项卡并滚动到底部。查找应用程序图标和启动图像,确保在 启动屏幕文件 字段中有一些值,这应该是 Main 或 LaunchScreen
【讨论】:
【参考方案5】:如果有人觉得这很有用:
就我而言,我曾经使用过
self.window = [[UIWindow alloc] init];
而不是
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
这就是问题的原因。
【讨论】:
【参考方案6】:我在没有 Default-568h@2x.png 启动屏幕的旧应用上收到此错误。当更高的 iPhone 首次推出时,这是向 iOS 发出的信号,表明该应用程序可以处理新的几何形状。否则,它会显示在 320x480 的窗口中。有趣的是,我什至没有注意到应用程序没有使用全屏。
【讨论】:
【参考方案7】:我无法测试efpies
解决方案,但我在我的应用程序中修复它的方法是将 MainWindow.xib 替换为 Storyboard。
【讨论】:
【参考方案8】:我们遇到了同样的问题,我们尝试了这个帖子中提出的解决方案,但没有成功。
最终为我们工作的是,将逻辑重写为纯编程而不是使用 xib。在此之后,我们看不到“意外的 nil 窗口”错误,并且视图在整个屏幕上都被点击了。
【讨论】:
【参考方案9】:如果这有助于其他在这里绊倒的人,当我在设置窗口框架时翻转 UIScreen.mainScreen().bounds
大小时,我也会收到此错误。
【讨论】:
【参考方案10】:我还将旧项目升级到 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]));
【讨论】:
【参考方案11】:就我而言,这是一个旧代码,在阅读完整代码后我发现了这一行
UIApplication.shared.delegate?.window??.isUserInteractionEnabled = false
我按照我的逻辑处理它,它现在正在工作。
【讨论】:
【参考方案12】:启用 Windows 用户交互对我有用。
window.isUserInteractionEnabled = true
【讨论】:
【参考方案13】:在创建窗口时使用新的 ios 8 'nativeBounds' UIScreen 属性而不是 'bounds' 为我解决了这个问题。无需其他更改。
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] nativeBounds]] autorelease];
为了也支持以前的版本,我对版本进行了运行时检查:
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
【讨论】:
以上是关于_UIApplicationHandleEventFromQueueEvent 中出现意外的 nil 窗口的主要内容,如果未能解决你的问题,请参考以下文章