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

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

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

也许你想让整个应用程序根本不反应?

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

使用[[UIApplication sharedApplication] endIgnoringInteractionEvents]; 把这个(贷记给里斯)

Swift也一样:

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

和Swift 3

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

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

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

另一个可行的select是使用通知中心。 所以当你的class级得到禁用信息就行了

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

当你的意见负载添加他们听

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

然后当不需要的时候停止听。

inheritanceUIViewController并实现禁用function,然后在所有其他视图控制器中inheritance该类将消除代码的重复。

我有点犹豫,为整个应用程序禁用交互 – 这是太过分积极,太侵入,当视图控制器在分割视图控制器内会发生什么? 那么这两个视图控制器将被禁用!

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

希望这可以帮助!

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

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

现在如果你想启用交互使用下面的代码片段

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

这里是Swift 2.2 iOS 9.3的代码

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

经常使用它,像我的冠军一样工作,非常有用的视图与许多IBActions API调用,你不想再等待第一个响应的呼叫

这里是Swift 3的代码

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

稍微更新语法