UIActionSheet取消按钮奇怪的行为

nev*_*ing 116 iphone cocoa-touch objective-c uiactionsheet ios

我有一个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];
}
Run Code Online (Sandbox Code Playgroud)

nev*_*ing 190

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

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

[actionSheet showFromTabBar:self.tabBarController.tabBar];
Run Code Online (Sandbox Code Playgroud)

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

[actionSheet showInView:self.view];
Run Code Online (Sandbox Code Playgroud)

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

[actionSheet showFromToolbar:self.myToolbar];
Run Code Online (Sandbox Code Playgroud)

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

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

2008年12月1日下午10:22 Tom Saxton:我更多地看了这个bug,这似乎与tabbar有关.

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

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

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

http://openradar.appspot.com/6410780

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

[sheet showInView:self.parentViewController.tabBarController.view];
Run Code Online (Sandbox Code Playgroud)

  • 你刚刚帮我解决了一个我不知道的问题! (14认同)
  • 另一个答案似乎可能更好.查找[actionSheet showInView:[self.view window]].似乎更直接,更通用. (11认同)

dri*_*guy 37

我找到了答案在这里工作的.

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

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

  • 这会引起另一个问题.当横向设备(以及所有其他内容)时,ActionSheet以纵向显示. (2认同)

Cor*_*oyd 22

而是使用:

[sheet showFromTabBar:theTabBar];
Run Code Online (Sandbox Code Playgroud)


Vig*_*esh 10

这是修复.试试这个:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];
Run Code Online (Sandbox Code Playgroud)


Raw*_*ean 5

我认为三个答案的组合是正确的处理方式:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];
Run Code Online (Sandbox Code Playgroud)

即,使用showFromTabBar(这就是为什么它存在),你不需要像Nathan指出的parentViewController(事实上,self.parentViewController.tabBarController.tabBar为我返回nil.