28

在将 Xcode 从版本 4 升级到 5 并因此从 iOS 6 升级到 iOS 7 后,我收到以下错误:

'NSInvalidArgumentException',原因:'工作表无法呈现,因为视图不在窗口中

在这一行:

[actionSheet showInView:self.view];
4

9 回答 9

48

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

UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
if ([window.subviews containsObject:self.view]) {
    [emailSheet showInView:self.view];
} else {
    [emailSheet showInView:window];
}
于 2013-09-22T02:45:25.503 回答
11

我遇到了同样的问题。在我的代码中,原因显然是我想在viewWillAppear:. 将代码移至 后viewDidAppear:,错误消失了。

于 2013-10-09T05:09:17.167 回答
7

我不知道问题的根本原因是什么,但我找到了一个对我有用的解决方案。代替self.view,放置以下行:

[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]

例如:

[actionSheet showInView:[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]];
于 2013-09-26T12:52:53.613 回答
2

我有同样的问题[actionSheet showInView:self.view];,我用[actionSheet showInView:[UIApplication sharedApplication].keyWindow];.

也许问题与Apple文档的段落有关:

子类化注释:

UIActionSheet 不是为子类而设计的,也不应该将视图添加到它的层次结构中。如果您需要呈现比 UIActionSheet API 提供的自定义更多的表单,您可以创建自己的表单并使用presentViewController:animated:completion:.

于 2014-02-06T21:59:41.720 回答
2

我遇到了同样的问题,在我的情况下,当我尝试在我的 self.view 上显示一个 ActionSheet 而我的 self.view 正在呈现另一个 viewController 时发生了这种情况。

这是崩溃:“无法呈现工作表,因为视图不在窗口中”

问题示例:

[modalViewController dismissModalViewControllerAnimated:YES];
[actionSheet showInView:self.view];

我通过等待 modalViewController 关闭然后显示 ActionSheet 解决了这个问题。

解决方案:

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

希望这可以帮助很多人:)

于 2014-01-01T13:19:47.917 回答
1

我以前用过

- (void)showFromTabBar:(UITabBar *)view;

并在我的一个控制器上遇到了类似的问题(我有一个实用程序方法可以处理显示来自各种控制器的操作表),因为它设置

hidesBottomBarWhenPushed = YES;

在 iOS 7 中,这现在似乎将 tabBar 上的 window 设置为 nil,从而导致提到的错误。我的解决方法是检查 tabBar 的 window 属性,如果 nil 调用

if (nil == tabBar.window) {
    [actionSheet showInView:self.window];
}
else {
    [actionSheet showFromTabBar:tabBar];
}
于 2014-03-08T19:30:05.280 回答
1

在我的情况下,当刚刚被推入堆栈的视图控制器决定要显示警报表时,就会发生这种情况。但是,显然视图控制器在被推送后还没有完全准备好这样做。我使用[actionSheet showInView:self.parentViewController.view];而不是[actionSheet showInView:self.view];.

于 2013-12-01T19:15:50.443 回答
1

我在工具栏上遇到了类似的问题,最好总是检查传递给选择器的视图是否showInView有一个不为零的窗口。例如:

if (self.view.window)
    [actionSheet showInView:self.view];

这样,我们就可以避免烦人的异常。然后,根据您的应用程序布局,您应该搜索有效视图以显示操作表。如果你的应用有标签栏或工具栏,最好使用

- (void)showFromToolbar:(UIToolbar *)view;
- (void)showFromTabBar:(UITabBar *)view;
于 2014-03-03T16:26:18.783 回答
0

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

于 2015-04-16T15:21:33.253 回答