【问题标题】:Disabling user interaction of the current view on screen禁用屏幕上当前视图的用户交互
【发布时间】:2011-12-14 05:58:40
【问题描述】:

我的应用有很多视图和它们各自的控制器。现在我有一组模型类,其中包含业务逻辑。模型类之一(NSObject 的子类)负责管理安全性。它的预期功能是侦听来自 Web 服务器的特定指令,如果从服务器收到“禁用”消息,则禁用 UI 以供进一步使用。

现在“禁用”消息可以在应用程序运行期间的任何时刻到达,并且任何视图都可以在屏幕上显示。如何确定哪个视图对用户可见(来自我的模型类)并禁用用户交互?

【问题讨论】:

    标签: iphone ios cocoa-touch ipad


    【解决方案1】:

    也许您希望整个应用程序根本不做出反应?

    [[UIApplication sharedApplication] beginIgnoringInteractionEvents];
    

    使用[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 还原此 (归功于 nerith)

    同样适用于 Swift:

    UIApplication.sharedApplication().beginIgnoringInteractionEvents()
    UIApplication.sharedApplication().endIgnoringInteractionEvents()
    

    和斯威夫特 3/4

    UIApplication.shared.beginIgnoringInteractionEvents()
    UIApplication.shared.endIgnoringInteractionEvents()
    

    为 iOS 13 编辑: beginIgnoringInteractionEvents 在 iOS13 中已弃用

    只需制作一个新的全尺寸视图并将其放置在您当前的视图上。 这将允许您阻止任何用户交互。

    【讨论】:

    • 直到现在才知道这个存在。很酷!一直在窗口上禁用 userInteraction,这会产生一些意外的 nil 错误。
    • 我一直在使用 userInteractionEnabled = false 无处不在,例如显示进度 hud 时的导航栏.. 应该早点知道这一点!
    • Omg 不知道这件事 - 太好了!
    • 请注意,此方法以“级联”方式工作。如果你调用 'begin' 10 次 - 你还必须调用 'end' 10 次 - 这可能非常好,或者如果你不知道它可能会让人头疼;)
    • @iOSdev 这个有替代品吗?
    【解决方案2】:

    这是 Swift 3 的代码

    UIApplication.shared.beginIgnoringInteractionEvents() 
    UIApplication.shared.endIgnoringInteractionEvents()
    

    语法略有更新

    【讨论】:

      【解决方案3】:

      我做过与此非常相似的事情。我通过在其他所有内容上放置一个半透明的黑色视图来禁用所有用户交互,这在视觉上区分了整个 UI 被禁用的事实,并阻止了所有触摸事件。我通常只是在将视图控制器的视图添加到窗口之后再将这个视图添加到窗口类中,然后在不需要时将其隐藏。

      【讨论】:

      • 感谢您的回复米卡。覆盖是我想到的第一件事。但由于我已经在使用叠加层(用于网络活动等),我不希望只为这个活动管理额外的视图。
      • 添加到主窗口的 UIViews 也不响应方向变化
      【解决方案4】:

      您可以在监听服务器的类中添加一个委托,因此当它收到该消息时,它只会对它的委托是谁调用禁用。无论显示哪个视图以获取消息以及正常执行,直到收到消息。如果是单例,只需将视图设置为viewWillAppear 上的委托。

      另一个可行的选择是使用通知中心。因此,当您的班级收到禁用消息时,就这样做

      [[NSNotificationCenter defaultCenter] postNotificationName:@"disableView" object:nil];
      

      当你的视图加载时添加它们来收听

      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disableView:) name:@"disableView" object:nil];
      

      然后在不需要时停止收听。

      继承 UIViewController 并实现禁用功能,然后在所有其他视图控制器中继承该类将消除代码重复。

      【讨论】:

      • cwieland 感谢您的回答。我想到了这种方式,但它需要编写很多类似的代码(我有大约 30 个视图和视图控制器)。但是 +1 对于子类化 UIViewController 的想法,如果我的应用程序尚未完成 90%,我会这样做。
      【解决方案5】:

      使用以下代码禁用与背景的交互

      //Ignore interaction for background activities
      [[UIApplication sharedApplication] beginIgnoringInteractionEvents];
      

      现在,如果您想启用交互,请使用以下 sn-p

      if ([[UIApplication sharedApplication] isIgnoringInteractionEvents]) {
      
          // Start interaction with application
          [[UIApplication sharedApplication] endIgnoringInteractionEvents];
      }
      

      【讨论】:

        【解决方案6】:

        我有点犹豫是否要禁用整个应用程序的交互 - 这太激进也太侵入性了,当视图控制器位于拆分视图控制器内时会发生什么?然后两个视图控制器都将被禁用!

        相反,您可以创建一个颜色清晰的视图控制器并以模态方式呈现,请参见下面的 Swift 2 示例:

        private func TransparentViewController() -> UIViewController {
          let transparentViewController = UIViewController(nibName: nil, bundle: nil)
          transparentViewController.modalPresentationStyle = .OverCurrentContext
          transparentViewController.modalTransitionStyle = .CrossDissolve
          transparentViewController.view.backgroundColor = UIColor.clearColor()
          return transparentViewController
        }
        

        现在您可以在显示 HUD 之前从视图控制器中显示它:

        let transparentViewController = TransparentViewController()
        self.presentViewController(transparentViewController, animated:false, completion: nil) 
        

        希望这会有所帮助!

        【讨论】:

          【解决方案7】:

          这里是 Swift 2.2 iOS 9.3 的代码

          UIApplication.sharedApplication().beginIgnoringInteractionEvents()
          UIApplication.sharedApplication().endIgnoringInteractionEvents()
          

          经常使用它,对我来说像冠军一样工作,对于具有许多 IBAction 进行 API 调用并且您不想在等待第一个响应时进行另一个调用的视图非常有用

          【讨论】:

            猜你喜欢
            • 2019-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-13
            • 2015-06-06
            • 2023-03-07
            • 2012-11-29
            • 2015-02-23
            相关资源
            最近更新 更多