禁用屏幕上当前视图的用户交互

时间:2011-10-24 15:27:44

标签: iphone ios cocoa-touch ipad

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

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

7 个答案:

答案 0 :(得分:107)

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

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

使用[[UIApplication sharedApplication] endIgnoringInteractionEvents];来恢复此功能 (信奉nerith)

对于Swift来说同样如此:

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

和Swift 3/4

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

以下是Swift 3的代码

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

轻微更新语法

答案 3 :(得分:1)

您可以在正在侦听服务器的类中添加委托,因此当它获取该消息时,它只会在其委托的任何人上调用disable。在接收到消息之前,无论哪个视图都显示获取消息以及正常执行。如果它是单身,只需将视图设置为viewWillAppear上的委托。

另一个可行的选择是使用通知中心。所以,当你的班级获得禁用信息时,只需执行

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

当你的观点加载时,将它们添加到监听

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

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

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

答案 4 :(得分:1)

使用以下代码禁用与后台的互动

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

现在,如果您要启用交互,请使用以下代码段

if ([[UIApplication sharedApplication] isIgnoringInteractionEvents]) {

    // Start interaction with application
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}

答案 5 :(得分:1)

我有点犹豫要禁用整个应用程序的交互 - 这太过于激进和过于干扰,当视图控制器在拆分视图控制器内时会发生什么?然后两个视图控制器都将被禁用!

相反,您可以创建一个清晰的视图控制器并以模态方式呈现它,请参阅下面的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) 

希望这有帮助!

答案 6 :(得分:0)

以下是Swift 2.2 iOS 9.3的代码

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

经常使用它,对我来说就像冠军一样,对于有许多发出API调用的IBAction的视图非常有用,你不想在等待第一个响应时再打一次电话