UIActionSheet取消按钮异常行为


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];
}

5
与此无关,我在WWDC上的Apple UI审查会议上被告知,“操作表”上的红色按钮实际上是用于“破坏性”操作(即“删除”)的。
拉明

是的,我最近阅读了人机界面指南并看到了。将其从红色更改为灰色。

Answers:


190

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

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

[actionSheet showFromTabBar:self.tabBarController.tabBar];

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

[actionSheet showInView:self.view];

如果您使用的是工具栏,请改用showFromToolbar:方法。您需要参考工具栏,最有可能是ivar

[actionSheet showFromToolbar:self.myToolbar];

我的旧答案也可以,但是很hacky:

刚找到一个可能的答案:

2008年1月12日10:22汤姆·萨克斯顿(Tom Saxton):我又看了一下这个错误,这似乎是选项卡的问题。

如果从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];

对此表示支持,因为它可以正常工作。为什么这比其他答案更好?
特福德

1
为什么选择parentViewController?即使视图位于导航视图中,tabBarController仍应指向正确的位置。在任何情况下都没有parentViewController的情况下对我有效。
内森2010年

11
另一个答案似乎更好。查找[actionSheet showInView:[self.view窗口]]。似乎更直接,更通用。
凯文

非常感谢您发布此答案。
fulvio

1
我的应用程序中没有标签栏,但仍然存在此类问题。我用“ [serf.view window]”解决了。无论如何,这不是标签栏问题。
Mike Keskinov 2012年

37

我在这里找到了可行的答案。

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

我尝试了几种方法来访问我的标签栏,他们以这种方式设置了该应用,看起来有些令人费解。


完善!谢谢。这对我来说是正确的解决方案,因为我遇到了UITableViewController的问题,该UITableViewController的工具栏不是这里的其他工具栏的TabBar。
威廉·丹尼斯

好东西,这对我有用!这绝对是最简单的方法!
cgossain 2011年

2
这会引起另一个问题。当设备横向放置(以及所有其他内容)时,ActionSheet以纵向显示。
Mike Keskinov 2012年

22

而是使用:

[sheet showFromTabBar:theTabBar];

1
我纠正了这个从showInTabBar:showFromTabBar:。另外请注意,有一个'showFromToolbar:`方法,具体取决于屏幕底部的屏幕家具。我认为,这是一个比公认答案更好的答案。
斯蒂芬·达林顿'02

Stephen,很好奇为什么您认为这比指定showInView:theTabBar更好?从耦合角度来看,我认为showInView可能会更理想,以防万一稍后将tabBar放下,例如用工具栏代替。我认为,特定的子视图控制器实际上不必真正了解或关心。
比利·格雷

如果选项卡栏稍后被删除,则无论如何都必须编辑该行代码(除非theTabBar是对传入的视图的命名不正确的引用)。因此,我看不出该方法与showInView:theTabBar的耦合如何。我也使用showFromTabBar:,因为对我来说似乎更安全。我不知道幕后到底发生了什么,但我想与带有标签栏视图的showFromView:相比,在将来的操作系统版本中showFromTabBar:不太可能中断。
Christopher Pickslay,2010年

10

修复方法如下:

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

5

我认为将三个答案结合起来是处理此问题的正确方法:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

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


当然,它返回nil,因为父视图控制器(即UITabBarViewController)没有嵌套到另一个UITabBarController中,因此其tabBarController属性为nil。
Dominik Seibold 2011年

1

仅供参考-UIDocumentInteractionController的操作表踩在选项卡栏上时遇到相同的问题。使用以下内容修复。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.