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

问题描述 投票:35回答:7

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

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

iphone ios cocoa-touch ipad
7个回答
107
投票

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

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

使用[[UIApplication sharedApplication] endIgnoringInteractionEvents];来恢复这个(信贷给nerith)

同样适用于Swift:

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

和斯威夫特3/4

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

3
投票

这是Swift 3的代码

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

轻微更新语法


2
投票

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


1
投票

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

另一个可行的选择是使用通知中心。所以,当你的班级获得禁用消息时,就这样做

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

当您的视图加载时添加它们来监听

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

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

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


1
投票

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

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

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

if ([[UIApplication sharedApplication] isIgnoringInteractionEvents]) {

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

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) 

希望这可以帮助!


0
投票

这是Swift 2.2 iOS 9.3的代码

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

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

© www.soinside.com 2019 - 2024. All rights reserved.