Ios ';NSInvalidArgumentException';,原因:';无法显示图纸,因为视图不在窗口中

Ios ';NSInvalidArgumentException';,原因:';无法显示图纸,因为视图不在窗口中,ios,xcode,ios7,xcode5,Ios,Xcode,Ios7,Xcode5,将Xcode从版本4升级到版本5,从而从iOS 6升级到iOS 7后,我遇到以下错误: “NSInvalidArgumentException”,原因:“由于视图不在窗口中,因此无法显示工作表。” 在这方面: [actionSheet showInView:self.view]; [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject] 我确实遇到了同样的问题,不幸的是,我仍然不确定问题的根本原因是什么。但是,

将Xcode从版本4升级到版本5,从而从iOS 6升级到iOS 7后,我遇到以下错误:

“NSInvalidArgumentException”,原因:“由于视图不在窗口中,因此无法显示工作表。”

在这方面:

[actionSheet showInView:self.view];
[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]

我确实遇到了同样的问题,不幸的是,我仍然不确定问题的根本原因是什么。但是,您可以在下面找到我当前的解决方案。如果我在导致问题的根源上取得任何进展,我会让你知道

UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
if ([window.subviews containsObject:self.view]) {
    [emailSheet showInView:self.view];
} else {
    [emailSheet showInView:window];
}

我不知道问题的根本原因是什么,但我找到了一个适合我的解决方案。将以下行放置在“self.view”的位置:

[actionSheet showInView:self.view];
[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]
例如:

[actionSheet showInView:[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]];
if (self.view.window)
    [actionSheet showInView:self.view];

我也有同样的问题。在我的代码中,原因很明显是我想在
视图中显示一个操作表:

将代码移动到
viewdide:
后,错误消失。

在我的例子中,当刚刚推到堆栈上的viewcontroller决定要显示警报表时,就会发生这种情况。但是,显然viewcontroller尚未完全准备好在按下后立即执行此操作。我使用
[actionSheet showInView:self.parentViewController.view]而不是
[actionSheet showInView:self.view]

我也遇到了同样的问题,在我的例子中,当我试图在我的self.view上显示操作表时,我的self.view正在显示另一个viewController

这是崩溃:“无法显示图纸,因为视图不在窗口中”

问题示例:

[modalViewController dismissModalViewControllerAnimated:YES];
[actionSheet showInView:self.view];
我通过等待modalViewController关闭然后显示操作表来解决问题

解决方案:

[modalViewController dismissModalViewControllerAnimated:YES];
[actionSheet performSelector:@selector(showInView:) withObject:self.view afterDelay:0.6];

希望这能帮助很多人:)

我也有同样的问题
[actionSheet showInView:self.view][actionSheet showInView:[UIApplication sharedApplication].keyWindow]解决了这个问题

问题可能与以下段落有关:

子类化注释: UIActionSheet不是设计成子类的,也不应该将视图添加到其层次结构中。如果您需要使用比UIActionSheet API提供的定制更多的工作表,您可以创建自己的工作表,并使用
presentViewController:animated:completion:
以模式显示它


我的工具栏也有类似的问题,最好总是检查传递给选择器的视图
showInView
是否有非空窗口。例如:

[actionSheet showInView:[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]];
if (self.view.window)
    [actionSheet showInView:self.view];
通过这种方式,我们可以避免恼人的异常。 然后,根据您的应用程序布局,您应该搜索一个有效的视图来显示操作表。如果你的应用程序有一个选项卡或工具栏,那么最好使用它

- (void)showFromToolbar:(UIToolbar *)view;
- (void)showFromTabBar:(UITabBar *)view;
我以前用过

- (void)showFromTabBar:(UITabBar *)view;
我的一个控制器在设置时遇到了类似的问题(我有一个实用方法,可以处理显示来自不同控制器的动作表)

hidesBottomBarWhenPushed = YES;
在iOS 7中,这会在选项卡栏上将window设置为nil,从而导致上述错误。我的解决方法是检查tabBar的window属性,如果为nil,则调用

if (nil == tabBar.window) {
    [actionSheet showInView:self.window];
}
else {
    [actionSheet showFromTabBar:tabBar];
}

在iOS 7中,发送到
showInView:
的视图应该是视图层次结构的一部分。应将其添加为某个视图的子视图。
您可以通过检查
view.window
是否为零来检查某些视图是否可以在
showInView:
中使用。

view.superview
也应该是非nil

在我的例子中,此代码为窗口返回nil。所以我使用
UIWindow*window=[[UIApplication-sharedApplication]delegate]window]
这是对nil窗口的解释。如果您对其根问题有任何了解,请尽快通知我。在我的情况下(见我之前的评论),我认为这是行不通的。在调试器中,如果查询keyWindow,将获得集合视图包装器。我不想那样。我需要代理视图层次结构中的视图。代理设置正确,视图看起来正确。事实上,这个功能以前就起过作用。我只是在帮助文本中注意到了这一点:“一般来说,如果你想在iPad应用程序中显示动作表,你应该使用showFromRect:inView:animated:方法来显示动作表。”。我的应用程序是一个通用的应用程序,但这个功能只在iPad的部分代码中。我想我会试试这个,虽然我不知道为什么它会更好。在iOS7的其他问题中,我刚刚遇到了这个问题。但是,我使用的不是self.view,而是self.myOwnView。在调试器中,我为actionSheet和self.myOwnView都提供了一个对象,细节似乎是正确的。所以我真的不知道问题出在哪里。在我的例子中,集合视图控制器中的一个选择调用其委托(主VC)的一个方法来建立一个操作表,用户在其中确认刚刚从集合视图控制器中做出的选择。我刚刚有了一个想法。我认为可能发生的情况是,我让collectionview控制器调用代理以更新信息,然后再调用代理以解除控制器。第一个调用是显示操作表的调用。可能是因为集合视图控制器仍在屏幕上,所以出现了错误。我会试着把这两个电话合并成一个。那样的话,我想控制器应该在屏幕外。这可能是真正的问题。在视图出现之前不能显示操作表。这应该是公认的答案;
viewwillbeen:
viewDidLoad:
中的行为在我的情况下是可以容忍的,在视图完全初始化并显示在屏幕上(viewdidlease)后,我收到了这个错误。我在展示一个基于用户交互的操作表,但仍然会遇到这个错误。所以这个解决方案在我的情况下不会有任何不同。