UIActionSheet取消button奇怪的行为

我有一个UIBarButtonItem打开一个操作表,以提供用户select做什么。 一切工作如预期,除非我试图点击“取消”button。 button的目标似乎已经从应该的位置上移了。 我只能通过点击“取消”和“确定”button中间的某个地方来激活它。

替代文字http://img.skitch.com/20090729-t994x5g3ka5sksi7sskt7is5mi.jpg

我已经在其他应用程序的行动表中尝试,他们工作得很好,所以这不只是我的大拇指。 操作表在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]; } 

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

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

 [actionSheet showFromTabBar:self.tabBarController.tabBar]; 

错误的方法
这将把可点击区域放在错误的地方(如果你使用标签栏或工具栏):

 [actionSheet showInView:self.view]; 

如果您正在使用工具栏 ,请改用showFromToolbar:方法。 你需要参考工具栏,最有可能是一个伊娃

 [actionSheet showFromToolbar:self.myToolbar]; 

我的老答案也适用,但是哈克:

刚刚find一个可能的答案:

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

如果您从UITabViewController的子控件的视图控制器中调用UIActionSheet的[sheet showInView:self.view],那么在UIActionSheet的位于tabbar视图之上的部分,取消button的命中testing失败。

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

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

http://openradar.appspot.com/6410780

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

 [sheet showInView:self.parentViewController.tabBarController.view]; 

我在这里find了一个答案。

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

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

而是使用:

 [sheet showFromTabBar:theTabBar]; 

这是修复。试试这个:

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

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

  [actionSheet showFromTabBar:self.tabBarController.tabBar]; 

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

仅供参考 – 与UIDocumentInteractionController的操作表单上的步骤相同的问题。 用以下来解决。

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

编写简化的代码

  actionSheet.actionSheetStyle = UIActionSheetStyleDefault; 

这工作很好