【问题标题】:UIActionSheet in iOS7 dismissing when user taps ANYWHERE on the screen on iPhoneiOS7中的UIActionSheet在用户点击iPhone屏幕上的任何地方时关闭
【发布时间】:2013-09-12 22:52:08
【问题描述】:

我注意到在iOS 7 a **UIActionSheet** automatically dismissesuser taps anywhere on the screen on an **iPhone**。这在 iOS 6 中并非如此,并且会导致意想不到的效果。 Is this a UI change? Bug? Is there a way to disable this?

From iOS 7 docs:
"如iOS人机界面所述 指南,您应该在操作表中包含一个取消按钮 显示在 iPhone 和那些显示在 iPad 上的打开 弹出框。否则,在 iPad 上,操作表会显示在 弹出框,用户可以通过点击外部取消操作表 弹出框,在这种情况下,您不需要包含取消 按钮。”

这似乎表明在操作表之外的任何地方点击时关闭的行为应该只适用于 iPad。但这现在发生在运行 iOS 7 的 iPhone 上,而运行 iOS 6 的 iPhone 上却没有

【问题讨论】:

  • 我发现只有在有取消按钮的情况下才会在用户点击屏幕上的任意位置时关闭,这可以让您通过没有取消按钮来解决此问题。
  • 我发现 UIActionSheet 在单击一个按钮后不会被关闭 - 您需要按两次按钮!如果我使用 -[UIActionSheet showInView:],就会发生这种情况。任何解决方法?
  • 我发现 UIActionSheet 在单击一个按钮后不会被关闭 - 您需要按两次按钮!如果我使用 -[UIActionSheet showInView:],就会发生这种情况。任何解决方法?我有一个 UICollectionView 数据源,我在其中调用 [actionSheet showInView:self.controller.view]。需要点击 2 次才能关闭。
  • @DeepakSharma 我没有这个问题。操作表是否有取消按钮。如果是这样,如果您点击操作表的外部,它会关闭吗?
  • @Scott 我不希望这种行为的原因是因为我绝对希望用户在操作表上做出决定。当操作表出现时,用户很可能已经多次点击屏幕,因此用户可能会在操作表出现时不小心在操作表之外点击,从而在用户阅读并制作之前将其关闭一个选择。

标签: objective-c cocoa uiactionsheet ios7


【解决方案1】:

关于您的问题Is this a UI change? Bug?

看起来像UI change not a bug 怎么说呢?
看看我从 iOS7 模拟器中拍摄的图像
它是 iPhone 的地图应用程序的图像。


当您点击按钮(显示为红色矩形)时,一个操作表将显示which have Cancel button,如下所示

如果您单击任何其他地方,它将关闭,在其他 Apple 应用程序(如 safari)中也可以找到相同的行为。
关于你的问题Is there a way to disable this?
抱歉,我没有答案。

【讨论】:

  • 所以“功能,而不是错误”。苹果是新的微软。
  • 如果您不使用取消按钮,则在外面点击操作表不会关闭。
【解决方案2】:

在我发布我的解决方案之前先说一句话​​。很容易担心行为的微小变化并想要立即禁用它。但考虑第一个一致性。这就是操作表在整个操作系统中的行为方式。如果禁用此行为,则会破坏一致性,这将导致用户体验不佳。

也就是说,这是我的解决方案。


iPhone 上的UIActionSheet 在单独的UIWindow 实例中打开其视图,该实例在显示时成为关键。您可以使用[UIApplication sharedApplication].keyWindow 访问此窗口。如果您检查此窗口的视图层次结构,您会注意到几个私有类,例如调光视图。您可以递归地遍历此视图层次结构并将view.userInteractionEnabled = NO; 设置为那里不是UIButton 子类的每个视图。这应该可以解决问题。

【讨论】:

    【解决方案3】:

    正如@nvrtdfrst 在他的cmets 中暗示的那样,设置cancelButton: nil 将摆脱默认的解雇行为。但是您仍然可以通过将其中一个自定义按钮的文本设置为 @"Cancel" 来获得取消按钮 - 由委托方法处理,如下所示:

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
         if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:@"Cancel"]) {
             // your cancellation code here
         }
    }
    

    有点hacky,但这是一个简单的解决方案。

    电话:null

    【讨论】:

      【解决方案4】:

      使用

      - (void)actionSheet:(UIActionSheet *)actionSheet 
      didDismissWithButtonIndex:(NSInteger)buttonIndex {...}
      

      【讨论】:

        【解决方案5】:

        这对我有用。

            (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
            if (buttonIndex == 0) {
                [self performSegueWithIdentifier:@"firstOption" sender:self];
            }else if (buttonIndex == 1){
                [self performSegueWithIdentifier:@"secondOption" sender:self];
            } else if (buttonIndex != 0 || buttonIndex != 1) {
                [actionSheet cancelButtonIndex];
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多