在将 Xcode 从版本 4 升级到 5 并因此从 iOS 6 升级到 iOS 7 后,我收到以下错误:
'NSInvalidArgumentException',原因:'工作表无法呈现,因为视图不在窗口中
在这一行:
[actionSheet showInView:self.view];
我确实遇到了同样的问题,不幸的是我仍然不确定问题的根本原因是什么。但是,您会在下面找到我当前的解决方案。如果我在导致问题的根方面取得任何进展,我会告诉你。
UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
if ([window.subviews containsObject:self.view]) {
[emailSheet showInView:self.view];
} else {
[emailSheet showInView:window];
}
我遇到了同样的问题。在我的代码中,原因显然是我想在viewWillAppear:
. 将代码移至 后viewDidAppear:
,错误消失了。
我不知道问题的根本原因是什么,但我找到了一个对我有用的解决方案。代替self.view
,放置以下行:
[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]
例如:
[actionSheet showInView:[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]];
我有同样的问题[actionSheet showInView:self.view];
,我用[actionSheet showInView:[UIApplication sharedApplication].keyWindow];
.
也许问题与Apple文档的段落有关:
子类化注释:
UIActionSheet 不是为子类而设计的,也不应该将视图添加到它的层次结构中。如果您需要呈现比 UIActionSheet API 提供的自定义更多的表单,您可以创建自己的表单并使用
presentViewController:animated:completion:
.
我遇到了同样的问题,在我的情况下,当我尝试在我的 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];
希望这可以帮助很多人:)
我以前用过
- (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];
}
在我的情况下,当刚刚被推入堆栈的视图控制器决定要显示警报表时,就会发生这种情况。但是,显然视图控制器在被推送后还没有完全准备好这样做。我使用[actionSheet showInView:self.parentViewController.view];
而不是[actionSheet showInView:self.view];
.
我在工具栏上遇到了类似的问题,最好总是检查传递给选择器的视图是否showInView
有一个不为零的窗口。例如:
if (self.view.window)
[actionSheet showInView:self.view];
这样,我们就可以避免烦人的异常。然后,根据您的应用程序布局,您应该搜索有效视图以显示操作表。如果你的应用有标签栏或工具栏,最好使用
- (void)showFromToolbar:(UIToolbar *)view;
- (void)showFromTabBar:(UITabBar *)view;
在 iOS 7 中,发送到的视图showInView:
应该是视图层次结构的一部分。它应该作为某些视图的子视图添加。您可以通过检查是否为 nil来检查是否
可以使用某些视图。也应该是非零showInView:
view.window
view.superview