【问题标题】:UIActionSheet cancel button strange behaviourUIActionSheet 取消按钮的奇怪行为
【发布时间】:2010-11-14 22:15:12
【问题描述】:

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

【问题讨论】:

  • 在一个不相关的说明中,我在 WWDC 的一次 Apple UI 审查会议上被告知,Action Sheets 上的红色按钮实际上是用于“破坏性”操作(即“删除”)。
  • 是的,我最近阅读了人机界面指南并看到了。将其从红色更改为灰色。

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


【解决方案1】:

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

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

[actionSheet showFromTabBar:self.tabBarController.tabBar];

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

[actionSheet showInView:self.view];

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

[actionSheet showFromToolbar:self.myToolbar];

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

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

2008 年 12 月 1 日晚上 10:22 汤姆萨克斯顿: 我又看了这个bug,好像是tabbar的问题。

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

【讨论】:

  • 赞成这个,因为它有效。为什么这比其他答案更好?
  • 为什么是parentViewController?即使视图位于导航视图中,tabBarController 仍应指向正确的位置。在任何情况下都可以在没有 parentViewController 的情况下为我工作。
  • 另一个答案似乎可能更好。寻找 [actionSheet showInView:[self.view window]]。看起来更直接,更通用。
  • 非常感谢您发布此答案。
  • 我的应用中没有标签栏,但还是有这样的问题。我用'[serf.view window]'解决了它。反正不是标签栏问题。
【解决方案2】:

我在here 上找到了一个可行的答案。

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

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

【讨论】:

  • 完美!谢谢。这对我来说是正确的解决方案,因为我遇到了 UITableViewController 的问题,它的工具栏 not 像其他人一样的 TabBar。
  • 好东西,这对我有用!这绝对是最简单的方法!
  • 这会导致另一个问题。当设备处于横向(以及所有其他内容)时,ActionSheet 以纵向显示。
【解决方案3】:

改为使用:

[sheet showFromTabBar:theTabBar];

【讨论】:

  • 我已将其从 showInTabBar: 更正为 showFromTabBar:。另请注意,有一个“showFromToolbar:”方法,具体取决于您在屏幕底部拥有的屏幕家具。我认为,这比公认的答案更好。
  • Stephen,为什么你认为这比指定 showInView:theTabBar 更好?从耦合的角度来看,我认为 showInView 可能会更理想,以防以后 tabBar 被删除,例如,可能会被工具栏替换。我认为,特定的子视图控制器不应该真的知道或关心。
  • 如果标签栏稍后被删除,您将不得不编辑该行代码(除非可能 theTabBar 是对传入视图的命名不佳的引用)。所以我看不出这个方法比 showInView:theTabBar 更耦合。我也使用 showFromTabBar: ,因为它对我来说似乎更安全。我不知道幕后发生了什么,但我认为 showFromTabBar: 在未来的操作系统版本中比 showFromView: 与标签栏视图相比不太可能中断。
【解决方案4】:

这是解决方法。试试这个:

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

【讨论】:

    【解决方案5】:

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

        [actionSheet showFromTabBar:self.tabBarController.tabBar];
    

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

    【讨论】:

    • 当然返回nil,因为父视图控制器(也就是UITabBarViewController)没有嵌套到另一个UITabBarController中,所以它的tabBarController-property是nil。
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

      编写简单的代码

       actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
      

      这很好

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        相关资源
        最近更新 更多