116

我有一个 UIBarButtonItem 打开一个操作表,为用户提供关于做什么的选择。除非我尝试单击“取消”按钮,否则一切都按预期工作。按钮的目标似乎已从应有的位置向上移动。我只能通过单击“取消”和“确定”按钮中间的某处来激活它。

我在其他应用程序中尝试过操作表,它们工作正常,所以这不仅仅是我的大拇指。操作表在 UIViewController 中打开

- (void)showOpenOptions
{
    UIActionSheet *sheet = [[UIActionSheet alloc] 
    initWithTitle:NSLocalizedString(@"Open link in external application?", @"Open in external application")
    delegate:self
    cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
    destructiveButtonTitle:NSLocalizedString(@"Open Link", @"Open Link")
    otherButtonTitles:nil];

    [sheet showInView:self.view];
    [sheet release];
}
4

7 回答 7

190

不要将当前视图控制器的视图传递给操作表,而是showFromTabBar:使用UIActionSheet.

正确的方式
这将给出正确的可点击区域:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

错误的方式
这会将可点击区域放在错误的位置(如果您使用的是标签栏或工具栏):

[actionSheet showInView:self.view];

如果您使用的是工具栏,请改用该showFromToolbar:方法。您需要对工具栏的引用,很可能是 ivar

[actionSheet showFromToolbar:self.myToolbar];

我的旧答案也有效,但很hacky:

刚刚找到一个可能的答案:

2008 年 12 月 1 日晚上 10:22 Tom Saxton:我看了这个 bug 更多,这似乎是标签栏的问题。

如果您从作为 UITabViewController 子级的视图控制器调用 UIActionSheet 的 [sheet showInView:self.view],则取消按钮的命中测试在位于标签栏视图上方的 UIActionSheet 部分中失败。

如果您改为传入 UITabBarController 的视图,则 UIActionSheet 将按预期运行。

注意:在 iPhone OS 2.1 和更早的版本中,当您传递子视图时,UIActionSheet 从标签栏的顶部出现,但在 2.2 中,它从标签栏的底部出现,从而覆盖标签视图。

http://openradar.appspot.com/6410780

编辑:当我将视图更改为标签栏的视图时,它可以正常工作

[sheet showInView:self.parentViewController.tabBarController.view];
于 2009-07-29T02:22:57.300 回答
37

我在这里找到了一个有效的答案。

使用:[filterActionSheet showInView:[self.view window]];

我尝试了几种方法来访问我的标签栏,他们设置这个应用程序的方式看起来很复杂......

于 2009-07-29T02:38:50.237 回答
22

而是使用:

[sheet showFromTabBar:theTabBar];
于 2009-07-29T03:01:50.200 回答
10

这是修复程序。试试这个:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];
于 2012-01-09T17:48:26.607 回答
5

我认为三个答案的组合是处理这个问题的正确方法:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

即,使用 showFromTabBar (这就是它存在的原因)并且你不需要像 Nathan 指出的那样 parentViewController (事实上, self.parentViewController.tabBarController.tabBar 为我返回 nil 。

于 2011-11-24T16:19:53.757 回答
1

仅供参考 - UIDocumentInteractionController 的操作表在标签栏上踩到了同样的问题。使用以下方法修复。

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];
于 2010-08-27T14:30:48.590 回答
-2

写简单的代码

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

这项工作很好

于 2012-07-04T11:26:46.833 回答