UIActionSheet取消按钮奇怪的行为

时间:2009-07-29 02:11:34

标签: ios objective-c iphone cocoa-touch uiactionsheet

我有一个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];
}

7 个答案:

答案 0 :(得分:190)

不要将当前视图控制器的视图传递给操作表,而是使用showFromTabBar:的{​​{1}}方法。

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

UIActionSheet

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

[actionSheet showFromTabBar:self.tabBarController.tabBar];

如果您使用的是工具栏,请改用[actionSheet showInView:self.view]; 方法。您需要对工具栏的引用,很可能是ivar

showFromToolbar:

我的旧答案也有效,但是很骇客:

刚刚找到了答案:

  

01-Dec-2008 10:22 PM Tom Saxton:   我再看一下这个bug,它似乎是tabbar的一个问题。

     

如果从作为UITabViewController的子视图的控制器中调用UIActionSheet的[sheet showInView:self.view],则取消按钮上的命中测试将失败在位于选项卡视图上方的UIActionSheet部分。 / p>      

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

     

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

http://openradar.appspot.com/6410780

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

[actionSheet showFromToolbar:self.myToolbar];

答案 1 :(得分:37)

我发现here的答案有效。

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

我尝试了几种方法来到我的标签栏,他们设置这个应用程序似乎令人费解......

答案 2 :(得分:22)

改为使用:

[sheet showFromTabBar:theTabBar];

答案 3 :(得分:10)

这是修复。试试这个:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];

答案 4 :(得分:5)

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

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

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

答案 5 :(得分:1)

仅供参考 - 与标签栏上的UIDocumentInteractionController操作表相同的问题。使用以下内容进行修复。

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];

答案 6 :(得分:-2)

编写简化代码

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

这项工作很好