Ios ';NSInvalidArgumentException';,原因:';无法显示图纸,因为视图不在窗口中
将Xcode从版本4升级到版本5,从而从iOS 6升级到iOS 7后,我遇到以下错误: “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] 我确实遇到了同样的问题,不幸的是,我仍然不确定问题的根本原因是什么。但是,
[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)后,我收到了这个错误。我在展示一个基于用户交互的操作表,但仍然会遇到这个错误。所以这个解决方案在我的情况下不会有任何不同。